我已将SDK更新为最新版本(API 23),并且不推荐使用fragment的onAttach(Activity)方法。所以,而不是使用该方法,现在我使用onAttach(上下文),但这一个在生命周期中不被调用。活动是来自v7的AppCompatActivity的实例,片段是类Fragment(android.app.Fragment)的实例。

任何想法如何获得onAttach在API 23中工作?

我发现一些答案,可以帮助你理解和解决这个问题:

>正如我之前提到的,我使用支持v7(AppCompatActivity)和android.app中的片段的活动。

>为了显示片段我得到片段管理器使用方法getFragmentManager对活动,因此片段管理器是FragmentManager的一个实例从android.app – >这里是问题

>如果在带有API 23的设备上运行应用程序(我在AS模拟器上运行它),您将看到将调用onAttach(Context)方法。

在通过FragmentManager显示片段的过程中,在特定时刻调用onAttach(..)方法。使用getFragmentManager(),你将得到一个片段管理器的实例,该片段管理器可用于在该设备上运行的Android版本(例如API 22,23)。在应用程序在具有API< 23,onAttach(Context)方法不可用,片段管理器不知道在API 23中有一个onAttach(Context)方法,这就是为什么它不为API调用23 - >这种问题的解决方案是使用FragmentManager从支持库。

解决方案:

>使用getSupportFragmentManager()将强制您使用支持库中的Fragment。所以第一个解决方案是用支持lib中的片段替换所有片段,并使用getSupportFragmentManager()。

>我已经实现的解决方案是处理2种可能性(1.应用程序运行在设备上,API< 23,应用程序运行在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)方法在所有的片段,我需要这个。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐