首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用onAttach(Context context)

未调用onAttach(Context context)
EN

Stack Overflow用户
提问于 2016-02-11 11:10:42
回答 1查看 927关注 0票数 1

我正在尝试使用API23为安卓应用程序创建一个DialogFragment。我发现这个接口的onAttach方法已经更新了,现在需要一个Context作为参数。问题是,我就是不能让我的DialogFragment连接到我的Activity。我得到了以下异常:

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
public void onAttach(Context context) {
    mCalled = true;
    final Activity hostActivity = mHost == null ? null : mHost.getActivity();
    if (hostActivity != null) {
        mCalled = false;
        onAttach(hostActivity);
    }
}

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

我的问题是,我说的对吗?这就是为什么会发生这种事吗?我想从另一个角度来看待这一点。有什么办法可以绕过这个问题吗?

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

编辑#2: Whelp,看起来一点错误都没有。我的问题的解决方案已经发布了。

EN

回答 1

Stack Overflow用户

发布于 2016-02-11 12:00:14

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35330121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档