我已将SDK更新至最新版本(API 23),并且针对Fragment的onAttach(Activity)
方法已被弃用。所以现在我使用onAttach(Context)
来代替该方法,但是在生命周期中此方法不会被调用。Activity是v7的AppCompatActivity
实例,而Fragment是android.app.Fragment
类的实例。
有任何想法如何让onAttach
在API 23中正常工作吗?
解决方案
我找到了一些答案,可以帮助您理解和解决这个问题:
解决方案:
使用getSupportFragmentManager()将强制您使用来自support库的Fragment。因此,第一种解决方案是使用来自support库的fragment替换所有fragment,并使用getSupportFragmentManager()。
我已经实现了的解决方案是处理2种可能性(1. 应用程序正在运行在具有API < 23的设备上;2. 应用程序正在运行在具有API >= 23的设备上)。
简而言之,在我的实现中,我为项目中的所有fragment提供了一个基类,并在其中添加了这段代码:
/*
* onAttach(Context) is not called on pre API 23 versions of Android and onAttach(Activity) is deprecated
* Use onAttachToContext instead
*/
@TargetApi(23)
@Override
public final void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override
public final void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/*
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
}
现在我只需在需要这个功能的所有片段上覆盖 onAttachToContext(Context) 方法即可。
onAttach(Context)
方法上有加上@Override
吗?如果没有,请加上。如果你在编译时遇到了“找不到 onAttach(Context) 方法”的错误,请确保你使用的是appcompat-v7
的 v23 版本。 - CommonsWareAppCompatActivity
。我已经重写了onAttach(Activity)
和onAttach(Context)
,并且两者都被调用了。在 Nexus 5 (MPA44G) 上进行了测试,minSdk = 16,targetSdk = 23。 - Mygod