android - 当关闭对话框 fragment 时,无法在 onSaveInstanceState 之后执行此操作

标签 android android-fragments android-dialogfragment

我遇到了 DialogFragments 的问题。我有一个 Activity,它有一个按钮,点击它会显示一个进度微调器(带有自定义 View 的 DialogFragment),然后转到另一个 Activity。在我的第二个 Activity 中,我有 button2,它的 onclick 会将结果发送回我之前的 Activity,这应该关闭进度微调器。

public class MainActivity extends AppCompatActivity {

private Button button;
private int stackLevel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    stackLevel=0;

    button = (Button)findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showProgressDialog();

            Intent intent = new Intent(MainActivity.this,           SecondActivity.class);
            startActivityForResult(intent,2);
        }
    });


}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode==2){

        dismissProgressDialog();

    }

}

public void showProgressDialog() {
    stackLevel++;

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("progressDialog");
    if (prev != null) {
        ft.remove(prev);
    }
    //ft.addToBackStack(null);
    // Create and show the dialog.
    DialogFragment newFragment = LoaderFragment.newInstance(stackLevel);
    //newFragment.show(ft,"progressDialog");
    ft.add(newFragment, "progressDialog");
    ft.commitAllowingStateLoss();
}


public void dismissProgressDialog() {

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog");
    if (prev != null) {
        prev.dismiss();
    }
        ft.commitAllowingStateLoss();
}


 }

Activity 2

public class SecondActivity extends AppCompatActivity {

private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);

    button = (Button)findViewById(R.id.button2);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            try {
                setResult(2);
            }catch (Exception e){

                e.printStackTrace();
            }


            finish();

        }
    });

}
}

但是当我关闭对话框 fragment 时出现以下错误

    Caused by: java.lang.IllegalStateException: Can not perform this action     after onSaveInstanceState
 at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1527)
 at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1545)
 at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:654)
 at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:621)
 at android.support.v4.app.DialogFragment.dismissInternal(DialogFragment.java:201)
 at android.support.v4.app.DialogFragment.dismiss(DialogFragment.java:167)
 at com.example.am46517.samplefragmentapplication.MainActivity.dismissProgressDialog(MainActivity.java:70)
 at com.example.am46517.samplefragmentapplication.MainActivity.onActivityResult(MainActivity.java:42)
 at android.app.Activity.dispatchActivityResult(Activity.java:6926)
 at android.app.ActivityThread.deliverResults(ActivityThread.java:4293)
 at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347) 
 at android.app.ActivityThread.-wrap20(ActivityThread.java)

最佳答案

这是在后台关闭 DialogFragment 的情况,因此只有在使用 dismissAllowingStateLoss() 方法完成时才允许关闭。但是要使用此方法,您需要仅使用 supportFragmentManager 来显示此对话框,如下所示:(对不起,答案是 Kotlin)

gameLoadingDialog = GameLoadingDialog()
gameLoadingDialog?.show(supportFragmentManager, "gameLoadingDialog") 

然后即使在后台也可以使用:

val prev = supportFragmentManager.findFragmentByTag("gameLoadingDialog")
if (prev != null && prev is GameLoadingDialog) {
    prev.dismissAllowingStateLoss()
}

关于android - 当关闭对话框 fragment 时,无法在 onSaveInstanceState 之后执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42704924/

相关文章:

android - 如何从 Facebook 导入生日列表?

android - 从 DialogFragment 接收结果

android - 如何从 DialogFragment 读取/写入首选项?

android - 如何使用构建类型编译本地 gradle 模块依赖项?

android - 找不到方法 '' void com.android.build.api.extension.AndroidComponentsExtension$DefaultImpls.androidTest$default(com.android.build

android - 将 gradle 依赖项添加到库 aar 包

android - 如果 MutableList 为空,如何更改 TextView 的可见性? (安卓/ Kotlin )

android - 如何在 kotlin 中使用 fragment

android - Android 中的全屏 DialogFragment(通过 ActionBar)