Android – onAttach(Context)不需要API 23

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

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

我find了一些可以帮助你理解和解决这个问题的答案:

  • 正如我之前提到的,我正在使用来自支持v7(AppCompatActivity)的活动和来自android.app的片段。
  • 为了显示片段,我使用方法getFragmentManager在活动上获得片段pipe理器,所以片段pipe理器是来自android.app – >的FragmentManager的一个实例,这里是问题
  • 如果你在API 23的设备上运行应用程序(我已经在AS模拟器上运行了它),你会发现onAttach(Context)方法会被调用。 在由FragmentManager显示片段的过程中,在特定时刻调用onAttach(..)方法。 使用getFragmentManager(),您将获得在该设备上运行的Android版本(例如API 22,23)的片段pipe理器实例。 如果应用程序在API <23的设备上运行,onAttach(Context)方法不可用,则片段pipe理器不知道在API 23中有一个onAttach(Context)方法,所以这就是为什么它不被调用对于API <23>,这种问题的解决scheme是使用来自支持库的FragmentManager。
  • 解决scheme:

    1. 使用getSupportFragmentManager()将强制您使用支持库中的片段。 所以第一个解决scheme是使用getSupportFragmentManager()从支持库中replace所有片段。

    2. 我已经实现的解决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()从片段:

    https://code.google.com/p/android/issues/detail?id=185848

    我想出了同样的问题。 我有一个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)被调用。 感谢您的高举!

    我遇到了同样的问题。 我已经做了什么来解决它:

    1. 将onAttachcallback的参数types从Activity更改为Context 。 由于未知的原因,这种修改导致在片段生命周期中onAttach(Context)方法不再被调用。 因此,我的应用程序崩溃了,因为onAttach方法中的代码从未执行过。

    2. 将onAttach方法中的代码移动到onCreate中,因为它仍然被执行。

    有了这个修改,该应用程序就像之前一样运行。 没有额外的import报表是必需的。

    在我读到你的答案@David Rauca后,我认为第二个可以解决我的问题。 但是当我查看源代码。 我发现实际上, onAttach(Context context)在Android M上不做任何事情,只是叫做旧方法。

    作为解决scheme:

     @SuppressWarnings("deprecation") 

    只要将其添加到旧的方法是最好的解决scheme。