【发布时间】:2015-11-11 15:59:06
【问题描述】:
我已将 SDK 更新到最新版本 (API 23),并且不推荐使用片段的 onAttach(Activity) 方法。因此,现在我使用的是onAttach(Context),而不是使用该方法,但是在生命周期中不会调用该方法。 Activity 是 v7 中 AppCompatActivity 的实例,片段是 Fragment 类 (android.app.Fragment) 的实例。
任何想法如何让onAttach 在 API 23 中工作?
解决方案
我找到了一些可以帮助您理解和解决此问题的答案:
解决方案:
使用 getSupportFragmentManager() 将强制您使用支持库中的片段。所以第一个解决方案是用支持库中的片段替换所有片段并使用getSupportFragmentManager()。
我已经实现的解决方案是处理 2 种可能性(1. 应用在 API = 23)。
简而言之,在我的实现中,我为项目中的所有片段创建了一个基类,并在其中添加了以下代码:
/*
* 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。 -
是的。我在 onAttach(Context) 上有 @Override。 v7 的版本也是 23.0.0。
-
刚刚测试过。我的活动也扩展了
AppCompatActivity。我已经覆盖了onAttach(Activity)和onAttach(Context),并且两者都被我调用了。使用 Nexus 5 (MPA44G) 测试,minSdk = 16,targetSdk = 23。 -
还没有。我已经尝试支持 v4 并且它有效。您可以尝试使用 support v4。
-
@WédneyYuri 根据this answer,在运行 API 级别 23 的设备上调用 onAttach(Context) 和 onAttach(Activity)。因此,您需要进行上述检查以确保您作为 onAttach 的一部分所做的工作不会在运行 API 级别 23 的设备上执行两次。