onAttach(Context context) 没有被调用

Posted

技术标签:

【中文标题】onAttach(Context context) 没有被调用【英文标题】:onAttach(Context context) not being called 【发布时间】:2016-05-21 16:27:05 【问题描述】:

我正在尝试使用 API 23 为 android 应用程序创建 DialogFragment。我发现 onAttach 方法已针对此 API 进行了更新,现在需要 Context 作为参数。问题是,我无法让我的DialogFragment 连接到我的Activity。我收到以下异常:

02-10 21:09:31.852 22647-22647/com.dactylotech.dactylo E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.dactylotech.dactylo, PID: 22647
 java.lang.IllegalStateException: Fragment ConnectionTypeAlertDialogFragmentc9d04dd not attached to Activity
     at android.app.Fragment.getResources(Fragment.java:805)
     at android.app.Fragment.getString(Fragment.java:827)
     at com.dactylotech.dactylo.ConnectionTypeAlertDialogFragment.<init>(ConnectionTypeAlertDialogFragment.java:17)
     at com.dactylotech.dactylo.ListBTDevicesActivity$PairedBTDevicesClickable.onItemClick(ListBTDevicesActivity.java:129)
     at android.widget.AdapterView.performItemClick(AdapterView.java:310)
     at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3049)
     at android.widget.AbsListView$3.run(AbsListView.java:3886)
     at android.os.Handler.handleCallback(Handler.java:746)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:5443)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

在进行了彻底的研究并没有找到真正的答案后,反而发现许多人有完全相同的问题并声称它被窃听,我决定查看 onAttach 的代码,如下所示:

public void onAttach(Context context) 
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) 
        mCalled = false;
        onAttach(hostActivity);
    

如果我没记错的话,hostActivity 可以分配给nullmHost.getActivity()。然而,由于这是对mHost 的第一次调用(在android 的Fragment 生命周期之后),mHost 从一开始就为空。这意味着表达式的计算结果为TRUE,因此,它再次被分配null!!同样,如果我没记错的话,这就是为什么永远不会调用 onAttach(hostActivity),因此永远不会将 DialogFragment 附加到 Activity

我的问题是,我说的对吗?这就是为什么会这样吗?我想从另一个角度来看待这个问题。有没有办法解决这个问题?

编辑: 此处显示的onAttach 代码是来自Fragment java 类的代码。 (android.app.Fragment)

编辑#2: 咳咳,好像一点错误都没有。我的问题的解决方案已发布。

【问题讨论】:

@Override public void onAttach(Activity activity) super.onAttach(activity); 这应该是 onAttach 函数。你这个我不是很熟悉。 这是在android.app.Fragment 类中找到的onAttach 方法的代码。这不是我用于 MY DialogFragment 类的 onAttach 代码。 【参考方案1】:

在片段的构造函数中,您调用了Fragment.getString()。此方法需要上下文来获取资源以获取字符串并因此尝试获取活动。

Fragment ConnectionTypeAlertDialogFragmentc9d04dd not attached to Activity 告诉你活动没有设置。这是因为构造函数在任何其他生命周期事件(如 onAttach())之前被调用。

您应该避免在构造函数中对片段进行任何初始化,而只使用生命周期事件。像这样你可以确保你需要的状态。例如,您可以将 getString() 周围的逻辑移动到 onAttach()

【讨论】:

非常感谢,它成功了。我试图在 DialogFragment 类中将 CharSequence 声明为全局变量,但使用 getString 来获取资源。

以上是关于onAttach(Context context) 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Fragment的public void onAttach(Context context) 没有被调用的问题

Fragment的public void onAttach(Context context) 没有被调用的问题

片段中未调用 onAttach()

片段的 onAttach 中的值的可能性是啥

fragment中通过getActivity()获取Context空指针

Android从Fragment跳转Activty