我正在尝试使用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
分配null
或mHost.getActivity()
。但是,由于这是对mHost
的首次调用(在android的Fragment
生命周期之后),因此mHost
从一开始就为null。这意味着该表达式的结果为TRUE
,因此它再次被分配为null
!同样,如果我没记错的话,这就是为什么从未调用onAttach(hostActivity)
的原因,因此DialogFragment从未附加到Activity
。我的问题是,我正确吗?这就是为什么会这样吗?我想对此发表另一种观点。有什么办法可以解决这个问题?
编辑:
此处显示的
onAttach
代码是Fragment
java类中的代码。 (android.app.Fragment
)编辑#2:
小鬼,看来根本没有错误。解决我的问题的方法已经发布。
最佳答案
在片段的构造函数中,您要调用Fragment.getString()
。此方法需要上下文来获取资源以获取字符串,从而尝试获取活动。Fragment ConnectionTypeAlertDialogFragment{c9d04dd} not attached to Activity
告诉您未设置活动。这是因为构造函数是在任何其他生命周期事件(例如onAttach()
)之前调用的。
您应该避免对构造函数中的片段进行任何初始化,而仅使用生命周期事件。这样,您可以确保所需的状态。相反,您可以将逻辑从getString()
移至onAttach()
。