【发布时间】: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 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 从一开始就为空。这意味着表达式的计算结果为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方法的代码。这不是我用于 MYDialogFragment类的onAttach代码。
标签: android debugging dialogfragment