Android - onAttach(Context)没有为API 23调用

Dav*_*uca 72 android android-appcompat

我已将SDK更新到最新版本(API 23),并且onAttach(Activity)不推荐使用片段方法.因此,不是使用该方法,现在我正在使用,onAttach(Context)但是在生命周期中不会调用此方法.活动是AppCompatActivity来自v7 的实例,片段是类Fragment(android.app.Fragment)的实例.

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

我找到了一些可以帮助您理解和解决此问题的答案:

  • 正如我之前提到的,我正在使用来自支持v7(AppCompatActivity)的活动和来自android.app的片段.

  • 为了显示片段,我在活动上使用方法getFragmentManager获取片段管理器,因此片段管理器是来自android.app的> FragmentManager的实例 - >这是问题所在

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

  • 解决方案:

    1. 使用getSupportFragmentManager()将强制您使用支持库中的片段.因此,第一个解决方案是使用支持lib中的片段替换所有片段并使用getSupportFragmentManager().

    2. 我已经实现的解决方案是处理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) {
    }
    
    Run Code Online (Sandbox Code Playgroud)

    现在我简单地在我需要它的所有片段上覆盖onAttachToContext(Context)方法.

    Fra*_*rio 27

    我用这种方式解决了这个问题:

    @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) {}
    
    Run Code Online (Sandbox Code Playgroud)

    • 关于onAttach(Context)..不会为API <23调用该方法,因此您不需要检查内部版本. (3认同)

    小智 17

    您应该尝试使用Fragment的支持库版本.

    你需要切换到import android.support.v4.app.Fragment;而不是import android.app.Fragment;.您还需要确保使用getSupportFragmentManager()而不是getFragmentManager().


    cep*_*3us 6

    请在此处发布有关此 BUG 的信息

    GOOGLE AOSP 项目主页上的问题:

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

    附:这不是你的工作来寻找这个问题的解决方案并找到任何类型的解决方法......而是强迫谷歌修复其损坏的 API!要做到这一点,你需要像我说的那样抱怨。

    相关问题 - 来自片段的 getContext():

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


    0x4*_*e84 5

    我想出了同样的问题。我的 minSdkVersion 为 19,targetSdkVersion 为 23,我在 AppCompatActivity 中使用 fragmentManager。

    onAttach(Activity activity)被标记为已弃用,但当我替换onAttach(Context context).

    所以相反,我现在有两个版本,当我在 API22 上运行我的应用程序时,会onAttach(Activity activity) 被触发,即使它被标记为已弃用。

    我尚未在 Android Marshmallow 设备上对其进行测试,但我的理解是它会运行该onAttach(Context context)版本,而忽略另一个版本。

    更新以考虑@skaar 在以下评论中的观察:我现在可以在 API23 上进行测试,并且可以确认在平台 23 上运行会导致调用这两种方法(使用 ActivityContext)。感谢您的提醒!