什么是正确的方式来处理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后支持和本地片段的实现应该有所不同呢?

Solutions Collecting From Web of "什么是正确的方式来处理onttach和onInflate上弃用的片段事件"

不,你不应该执行

 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。 这在支持库中找不到。