【问题标题】:Cannot Perform this task after onSavedInstanceState while Dismissing dialog fragment after pressing home button按下主页按钮后关闭对话框片段时,onSavedInstanceState 后无法执行此任务
【发布时间】:2014-03-17 21:00:13
【问题描述】:

我有一个处理用户注册的活动 (FragmentActivity)。当任务在活动中异步处理时,单击按钮会显示 DialogFragment。然后在处理完任务后,将关闭 FragmentDialog。一切运行顺利,即使配置更改(如改变方向),但我发现如果我在后台任务运行时按下主页按钮,应用程序在它试图关闭 FragmentDialog 并且当我重新启动应用程序时崩溃,我发现对话框仍在运行。

我搜索并找到了很多讨论、解决方案和解决方法,hereherehere。但我无法实施其中任何一个来解决我的问题。

这是我的工作:

为注册用户点击按钮调用的方法:

    private void startRegDialog(final String phoneNumber, String password) {
    Log.i("tag", "startregdailog called");

    verifiedUser = false;

            //start Dialog fragment here.
    final SignUpDialogFragment mDialogFragment = SignUpDialogFragment.newInstance();
    mDialogFragment.show(getSupportFragmentManager(), "dailogFragment");

    ParseUser CreateNewUser = new ParseUser();

    CreateNewUser.setUsername(phoneNumber);
    CreateNewUser.setPassword(password);
    CreateNewUser.put("userVerified", verifiedUser);
    Log.i("tag", "starting task");

    CreateNewUser.signUpInBackground(new SignUpCallback() {

        @Override
        public void done(ParseException e) {
            Log.i("tag", "task done");

               //Dismiss Dialog after receiving result

            if(mDialogFragment !=null){
            mDialogFragment.dismiss();
            }

            if(e != null){
                Log.i("Tag", "user not Created");
                String errorMessage = e.getMessage().toString();
                onError(errorMessage);

            } 
            else {
                Log.i("Tag", "userSuccessfully Created");
                Intent VerifyAccount = new Intent(context, VerifyAccount.class);
                VerifyAccount.putExtra("phoneNo", phoneNumber);
                startActivity(VerifyAccount);
            }
        }
    });
}

这里是 LOGCAT 输出

  03-17 22:12:40.070: E/AndroidRuntime(16000): FATAL EXCEPTION: main
  03-17 22:12:40.070: E/AndroidRuntime(16000): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1343)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1361)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:189)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:155)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.example.razcat.CreateAccount$3.done(CreateAccount.java:273)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.SignUpCallback.internalDone(SignUpCallback.java:39)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.SignUpCallback.internalDone(SignUpCallback.java:1)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.parse.Parse$6$1.run(Parse.java:834)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Handler.handleCallback(Handler.java:615)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Handler.dispatchMessage(Handler.java:92)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.os.Looper.loop(Looper.java:155)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at android.app.ActivityThread.main(ActivityThread.java:5454)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at java.lang.reflect.Method.invokeNative(Native Method)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at java.lang.reflect.Method.invoke(Method.java:511)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
  03-17 22:12:40.070: E/AndroidRuntime(16000):  at dalvik.system.NativeStart.main(Native Method)

 Please any help would be useful thanks. 

【问题讨论】:

  • 是否有任何关于崩溃的 logcat 输出可以与我们分享?
  • 我忘了补充,刚刚做了。
  • CreateAccount.java,第 273 行?
  • 这就是我关闭对话的地方,mDialogFragment.dismiss();
  • 放这行代码 if(mDialogFragment !=null){ mDialogFragment.dismiss(); } 在 if 和 else 中并从那里删除该代码然后尝试。另外,如果它不起作用,请尝试在创建对话框片段时调用 setRetainInstance(true)。

标签: android android-fragments


【解决方案1】:

要删除 Dialog Fragment,您需要通过它的标签调用它,然后只有您可以关闭它。在您的情况下,您已将“dailogFragment”作为标签。

mDialogFragment.show(getSupportFragmentManager(), "dailogFragment");

所以现在要删除它,首先通过它的标签调用它,如下所示:

Fragment mDialogFragment= getSupportFragmentManager().findFragmentByTag("dailogFragment");
//then check if it's null
    if (mDialogFragment!= null) {
        DialogFragment df = (DialogFragment) mDialogFragment;
//Now dismiss.
        df.dismiss();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-13
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多