什么是正确的方式来处理onttach和onInflate上弃用的片段事件

我已经阅读了一些文章和回答(包括这一个 )关于弃用的代码,但我有点困惑, onInflate如何处理(特别是)不赞成的Fragment事件处理程序onInflate

我已经取代了我的执行

 public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

 public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) 

如果我在<API23机器上运行我的应用程序,则不会调用replace代码。

如果我恢复原来的弃用代码(这样我现在就实现了这两个方法),那么不赞成使用的代码被调用,返回正确的function,但是现在正在对不推荐使用的方法(?)进行调用。

而当我在API23机器上运行应用程序时,看起来这个处理程序的两个版本都被调用了。

所以问题是,这里发生了什么? 如果我正在编写应该在API23和更早版本上运行的代码,是否需要实现已弃用的方法以及新的方法?

如果是这样的话,我是否需要寻找并实施其他被弃用的方法“以防万一”? (并且,因此,是否存在这些被弃用的方法的列表以“后退编码”)?


更新:

我现在已经从使用android.app.Fragment更改为android.support.v4.app.Fragment (即从本地片段到支持片段),并且该应用程序现在可以按照预期执行,replace处理程序代码将运行于所有版本,并且按预期步进Android源。

但问题依然存在: 为什么

为什么 “原生”的android.app.Fragment实现被修改? 回顾前面的问题,这个问题在2015年9月被讨论。那为什么它仍然是一个问题? 为什么在API 11后支持和本地片段的实现应该有所不同呢?

  • 与ListFragment FragmentPagerAdapter getItem错误
  • DialogFragment中的ViewPager - IllegalStateException:Fragment没有视图
  • 我的Android导航抽屉活动发生了什么?
  • Android错误膨胀类SwipeRefreshLayout
  • 在浏览片段时正确处理DrawerLayoutanimation
  • 把片段带到前面(没有片段娱乐)
  • 如何在WebView里添加“返回”function在Fragment里面?
  • Android - 使用GoogleMaps API 2.0的SupportMapFragment提供IllegalArgumentException
  • 不,你不应该执行

     public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) 

    当一个方法被弃用时,你可以(通常)安全地使用replace函数。 检查onInflate的片段的定义:

     public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onInflate(hostActivity, attrs, savedInstanceState); } } @Deprecated public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) { mCalled = true; } 

    正如你所看到的, onInflate(Context context...)onInflate(Activity activity...)的扩展,并且是向后兼容的。 通过调用super.onInflate(context, attrs, savedInstanceState); 在你重写的方法中,你可以放心地假设它可以在API23和更早的版本上工作。

    如果我在<API23机器上运行我的应用程序,则不会调用replace代码。

    这似乎很奇怪,我不能重现它,我的日志是在一个非v23机器上用这样的代码执行的:

     @Override public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { super.onInflate(context, attrs, savedInstanceState); Log.w(TAG, "I'm being executed"); } 

    确保:

    1. 您正在导入Fragment的支持版本android.support.v4.app.Fragment而不是android.app.Fragment ,并且您使用getSupportFragmentManager()而不是getFragmentManager()
    2. 您拥有最新的support-v4appcompat-v7库以及appcompat-v7 compileSdkVersion 23

    而当我在API23机器上运行应用程序时,看起来这个处理程序的两个版本都被调用了。

    这可以通过onInflate(Context context...)代码解释,如果由Activity调用,则调用onInflate(Activity activity...)

    编辑

    关于更新:

    android.app.Fragment本地实现不应该是向后兼容的。 android.app.Fragment的代码通常比android.support.v4.app.Fragment更简单,因为这个事实。

    另外,在本地实现中有一些function不能在支持库中引入,因为它很难devise,或者因为它不是开发者的优先考虑。 例如在本地实现中,在onInflate()源代码中,有一些使用Transition来animation新片段的入口或出口的animation。 这在支持库中找不到。