Android – onAttach(Context)不需要API 23
我已经将SDK更新到最新版本(API 23),并且onAttach(Activity)
方法。 所以,而不是使用该方法,现在我使用onAttach(Context)
但是这个不在生命周期中调用。 该活动是来自v7的AppCompatActivity
一个实例,片段是类Fragment( android.app.Fragment
)的一个实例。
任何想法如何让onAttach
在API 23中工作?
解
我find了一些可以帮助你理解和解决这个问题的答案:
解决scheme:
-
使用getSupportFragmentManager()将强制您使用支持库中的片段。 所以第一个解决scheme是使用getSupportFragmentManager()从支持库中replace所有片段。
-
我已经实现的解决scheme是处理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)方法,我需要这个。
我以这种方式解决了这个问题:
@TargetApi(23) @Override public void onAttach(Context context) { //This method avoid to call super.onAttach(context) if I'm not using api 23 or more //if (Build.VERSION.SDK_INT >= 23) { super.onAttach(context); onAttachToContext(context); //} } /* * Deprecated on API 23 * Use onAttachToContext instead */ @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < 23) { onAttachToContext(activity); } } /* * This method will be called from one of the two previous method */ protected void onAttachToContext(Context context) {}
您应该尝试使用支持库版本的Fragment。
你需要切换到import android.support.v4.app.Fragment;
而不是import android.app.Fragment;
。 您还需要确保使用getSupportFragmentManager()
而不是getFragmentManager()
。
请认真阅读此处的BUG
发布在GOOGLE AOSP项目上的问题主页:
https://code.google.com/p/android/issues/detail?id=185465
PS。 这不是你的工作,以寻求解决这个问题,并find任何forms的解决方法..但强迫谷歌修复其破损的API! 要做到这一点,你需要抱怨,如我所说。
相关的问题 – getContext()从片段:
我想出了同样的问题。 我有一个19的minSdkVersion和23的targetSdkVersion,我在AppCompatActivity中使用fragmentManager。
onAttach(Activity activity)
被标记为不赞成,但是当我用onAttach(Context context)
replace它时,我碰到了应用程序崩溃。
相反,我现在有两个版本 ,当我在API22上运行我的应用程序时, onAttach(Activity activity)
被触发 ,即使它被标记为已弃用。
我没有在Android Marshmallow设备上testing过,但是我的理解是它会运行onAttach(Context context)
版本,忽略另一个版本。
在下面的评论中考虑@ skaar的观察:我现在可以testingAPI23,并且可以确认在平台23上运行会导致两个方法(包括Activity 和 Context)被调用。 感谢您的高举!
我遇到了同样的问题。 我已经做了什么来解决它:
-
将onAttachcallback的参数types从Activity更改为Context 。 由于未知的原因,这种修改导致在片段生命周期中onAttach(Context)方法不再被调用。 因此,我的应用程序崩溃了,因为onAttach方法中的代码从未执行过。
-
将onAttach方法中的代码移动到onCreate中,因为它仍然被执行。
有了这个修改,该应用程序就像之前一样运行。 没有额外的import
报表是必需的。
在我读到你的答案@David Rauca后,我认为第二个可以解决我的问题。 但是当我查看源代码。 我发现实际上, onAttach(Context context)
在Android M上不做任何事情,只是叫做旧方法。
作为解决scheme:
@SuppressWarnings("deprecation")
只要将其添加到旧的方法是最好的解决scheme。