onAttach(上下文上下文)未被调用

时间:2016-02-11 03:10:42

标签: android debugging dialogfragment

我正在尝试使用API​​ 23为Android应用程序创建DialogFragment。我发现此API的onAttach方法已更新,现在需要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 ConnectionTypeAlertDialogFragment{c9d04dd} 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&#39; s Fragment生命周期之后),mHost从一开始就为空。这意味着表达式的计算结果为TRUE,因此,它再次被赋予null!同样,如果我没有弄错,这就是永远不会调用onAttach(hostActivity)的原因,因此DialogFragment永远不会附加到Activity

我的问题是,我是否正确?这是为什么会发生这种情况?我想在此处得到另一种观点。有没有办法解决这个问题?

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

编辑#2:编辑#2: Whelp,似乎根本没有错误。已发布我的问题的解决方案。

1 个答案:

答案 0 :(得分:3)

在您的片段构建器中,您正在呼叫Fragment.getString()。此方法需要一个上下文来获取资源以获取字符串,从而尝试获取活动。

Fragment ConnectionTypeAlertDialogFragment{c9d04dd} not attached to Activity告诉您未设置活动。这是因为在onAttach()等任何其他生命周期事件之前调用构造函数。

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