【问题标题】:Calling DialogFragment from Activity resulting in "IllegalStateException: fragment not attached to Activity"从 Activity 调用 DialogFragment 导致“IllegalStateException:片段未附加到 Activity”
【发布时间】:2014-05-29 10:50:06
【问题描述】:

我有一个包含 Fragment 的 Activity,我需要显示一个 DialogFragment(在 Fragment 内声明为 public 和 static)用于注销用户。 在此对话框中,我需要发出服务器请求,完成后,必须关闭对话框。

这里的问题是,当服务器请求到达时,我得到错误“IllegalStateException:fragment not attach to Activity”

有没有办法克服这个问题?

编辑:

这是logcat 输出:

E/AndroidRuntime(13849): java.lang.IllegalStateException: Fragment LogoutDialogFragment{4256be70} not attached to Activity
E/AndroidRuntime(13849):    at android.support.v4.app.Fragment.startActivity(Fragment.java:836)
E/AndroidRuntime(13849):    at nl.emte.merchant.ui.EmteActivity$LogoutDialogFragment$1$1.onDataLoad(EmteActivity.java:328)
E/AndroidRuntime(13849):    at nl.emte.merchant.api.EmteApiManager$5.onPostExecute(EmteApiManager.java:212)

这是LogOutFragment 的代码,即允许用户注销的DialogFragment

public static class LogoutDialogFragment extends SherlockDialogFragment {

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setCancelable(true);
            builder.setMessage(R.string.logout_screen_description);
            builder.setPositiveButton(R.string.logout_positive_button_lbl,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.dismiss();
                            EmteApiManager.getInstance().doLogout(new DataLoadListner() {

                                @Override
                                public void onError(Object errorMessage) {
                                }

                                @Override
                                public void onDataLoad(Object result) {
                                    Intent intent = new Intent(
                                            IntentActions.ACTION_LOGIN);
                                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            });

                        }
                    }).setNegativeButton(R.string.logout_negative_button_lbl,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
            return builder.create();
        }
    }

提前致谢!

【问题讨论】:

  • 需要更多信息来帮助你,如果你能发布一些代码和你的 logcat 会很棒
  • @zozelfelfo 你去 ;)
  • 您能突出显示EmteActivity.java:328吗?

标签: android android-fragments


【解决方案1】:

您可以使用使用应用程序上下文进行回调的静态类。

Activity 和 Fragment 是短暂的,因此在异步回调之后依赖它们处于良好状态是很危险的。

【讨论】:

    【解决方案2】:

    我认为你不应该在调用 startActivity() 之前调用dismiss

    【讨论】:

      猜你喜欢
      • 2018-01-26
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2018-09-20
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      相关资源
      最近更新 更多