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
可以分配给null
或mHost.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) 没有被调用的问题