从onActivityResult中显示DialogFragment

84

我在我的一个碎片的onActivityResult中有以下代码:

onActivityResult(int requestCode, int resultCode, Intent data){
   //other code
   ProgressFragment progFragment = new ProgressFragment();  
   progFragment.show(getActivity().getSupportFragmentManager(), PROG_DIALOG_TAG);
   // other code
}

然而,我遇到了以下错误:

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState   

有人知道发生了什么,或者我该如何解决这个问题吗?需要注意的是,我正在使用Android Support Package。

17个回答

2

这是一个老问题,但我认为我已经用最简单的方法解决了:


getActivity().runOnUiThread(new Runnable() {
    @Override
        public void run() {
            MsgUtils.toast(getString(R.string.msg_img_saved),
                    getActivity().getApplicationContext());
        }
    });

2

我知道这个问题已经有一段时间了,但是有比其他答案更简单的方法来解决这个问题... 在我的特定情况下,我需要从一个片段的onActivityResult()方法中显示一个DialogFragment。

以下是我处理它的代码,它运行得非常好:

DialogFragment myFrag; //Don't forget to instantiate this
FragmentTransaction trans = getActivity().getSupportFragmentManager().beginTransaction();
trans.add(myFrag, "MyDialogFragmentTag");
trans.commitAllowingStateLoss();

正如其他帖子中提到的那样,如果你不小心提交了有状态丢失的代码,就会导致问题...在我的情况下,我只是向用户显示一个错误消息,并附带一个关闭对话框的按钮,所以如果该状态丢失了,也不是什么大问题。

希望这可以帮助到您...


0

另一种方式:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case Activity.RESULT_OK:
            new Handler(new Handler.Callback() {
                @Override
                public boolean handleMessage(Message m) {
                    showErrorDialog(msg);
                    return false;
                }
            }).sendEmptyMessage(0);
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}


private void showErrorDialog(String msg) {
    // build and show dialog here
}

0

在活动中执行 .show(getSupportFragmentManager(), "MyDialog"); 时我遇到了这个错误。

首先尝试 .show(getSupportFragmentManager().beginTransaction(), "MyDialog");

如果仍然不起作用,可以参考这篇文章(Show DialogFragment from onActivityResult)帮助我解决了问题。


0
我找到的最干净的解决方案是这个:
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            onActivityResultDelayed(requestCode, resultCode, data);
        }
    });
}

public void onActivityResultDelayed(int requestCode, int resultCode, Intent data) {
    // Move your onActivityResult() code here.
}

-1

在处理片段之前,只需调用super.onActivityResult(requestCode, resultCode, data);


-3

正如大家所知,这个问题是由于onActivityResult()在onstart()之前被调用,因此只需在onActivityResult()中的开头调用onstart(),就像我在这段代码中所做的那样。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      onStart();
      //write you code here
}

你绝不能直接调用Android生命周期方法,这些方法只能由系统调用。 - Chantell Osejo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接