在onAttach和onInflate

时间:2016-03-21 15:55:31

标签: android android-fragments

我已经阅读了一些关于弃用代码的文章和答案(包括this one),但我对如何处理(特别是)已弃用的Fragment事件处理程序{{}感到困惑。 1}}。

我已经取代了

的实现
onInflate

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

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

如果我恢复原来弃用的代码(这样我现在已经实现了两个方法),那么调用已弃用的代码,返回正确的功能,但现在正在调用不推荐的方法(?)。

当我在API23机器上运行应用程序时,似乎会调用处理程序的两个版本。

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

如果是这样的话,我是否需要寻找并实施其他已弃用的方法"以防万一?"? (因此,这些已弃用的方法的列表是"返回代码" for?)

更新:

我现在已经从使用public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) 更改为android.app.Fragment(即从本机片段更改为支持片段),应用程序现在正在按预期执行,并且所有版本都运行替换处理程序代码,并且按预期逐步浏览android源代码。

但问题仍然存在:为什么

为什么是'原生' android.support.v4.app.Fragment实施****了吗?回顾之前的问题,然后在2015年9月讨论了这个问题。所以为什么仍然是一个问题?并且为什么应该在API 11后支持和本机片段的实现方面有所不同?

1 个答案:

答案 0 :(得分:4)

不,你不应该实施

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

不推荐使用某个方法时,您可以(通常)安全地使用替换函数。检查片段对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机器,更换代码不是   调用。

这看起来很奇怪,我无法重现它,我的日志正在非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-v4
  3. 中有appcompat-v7compileSdkVersion 23以及build.gradle的最新库
      

    当我在API23机器上运行应用程序时,它似乎是两个   调用处理程序的版本。

    这可以通过onInflate(Context context...)代码来解释,如果它被活动调用,则会调用onInflate(Activity activity...)

    修改

    关于更新:

    android.app.Fragment的原生实现不应该是向后兼容的。由于这一事实,android.app.Fragment的代码通常比android.support.v4.app.Fragment的代码简单得多。

    此外,本机实现中有一些功能无法在支持库中引入,因为它很难设计,或者因为它不是开发人员的优先级。例如。在本机实现中,在onInflate()源代码中,有一些使用Transition来动画新片段的入口或出口。这在支持库中找不到。