我已经阅读了一些关于弃用代码的文章和答案(包括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后支持和本机片段的实现方面有所不同?
答案 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");
}
确保:
android.support.v4.app.Fragment
而不是android.app.Fragment
,并且您使用getSupportFragmentManager()
代替getFragmentManager()
。support-v4
appcompat-v7
和compileSdkVersion 23
以及build.gradle
的最新库
醇>
当我在API23机器上运行应用程序时,它似乎是两个 调用处理程序的版本。
这可以通过onInflate(Context context...)
代码来解释,如果它被活动调用,则会调用onInflate(Activity activity...)
修改强>
关于更新:
android.app.Fragment
的原生实现不应该是向后兼容的。由于这一事实,android.app.Fragment
的代码通常比android.support.v4.app.Fragment
的代码简单得多。
此外,本机实现中有一些功能无法在支持库中引入,因为它很难设计,或者因为它不是开发人员的优先级。例如。在本机实现中,在onInflate()源代码中,有一些使用Transition来动画新片段的入口或出口。这在支持库中找不到。