当对话框片段关闭时,无法在 onSaveInstanceState 之后执行此操作

use*_*232 4 android android-fragments android-dialogfragment

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

\n\n
public class MainActivity extends AppCompatActivity {\n\nprivate Button button;\nprivate int stackLevel;\n\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.activity_main);\n    stackLevel=0;\n\n    button = (Button)findViewById(R.id.button);\n    button.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n            showProgressDialog();\n\n            Intent intent = new Intent(MainActivity.this,           SecondActivity.class);\n            startActivityForResult(intent,2);\n        }\n    });\n\n\n}\n\n@Override\nprotected void onActivityResult(int requestCode, int resultCode, Intent data) {\n\n    if(requestCode==2){\n\n        dismissProgressDialog();\n\n    }\n\n}\n\npublic void showProgressDialog() {\n    stackLevel++;\n\n    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n    Fragment prev = getSupportFragmentManager().findFragmentByTag("progressDialog");\n    if (prev != null) {\n        ft.remove(prev);\n    }\n    //ft.addToBackStack(null);\n    // Create and show the dialog.\n    DialogFragment newFragment = LoaderFragment.newInstance(stackLevel);\n    //newFragment.show(ft,"progressDialog");\n    ft.add(newFragment, "progressDialog");\n    ft.commitAllowingStateLoss();\n}\n\n\npublic void dismissProgressDialog() {\n\n    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();\n    DialogFragment prev = (DialogFragment) getSupportFragmentManager().findFragmentByTag("progressDialog");\n    if (prev != null) {\n        prev.dismiss();\n    }\n        ft.commitAllowingStateLoss();\n}\n\n\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n

活动2

\n\n
public class SecondActivity extends AppCompatActivity {\n\nprivate Button button;\n@Override\nprotected void onCreate(@Nullable Bundle savedInstanceState) {\n    super.onCreate(savedInstanceState);\n    setContentView(R.layout.second_layout);\n\n    button = (Button)findViewById(R.id.button2);\n    button.setOnClickListener(new View.OnClickListener() {\n        @Override\n        public void onClick(View view) {\n\n            try {\n                setResult(2);\n            }catch (Exception e){\n\n                e.printStackTrace();\n            }\n\n\n            finish();\n\n        }\n    });\n\n}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

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

\xc2\xa0

\n

Kno*_*wIT 6

这是在后台驳回的情况DialogFragment,因此只有通过方法完成才允许驳回dismissAllowingStateLoss()。但是要使用此方法,您需要supportFragmentManager仅使用以下内容来显示此对话框:(请原谅,答案在 Kotlin 中)

gameLoadingDialog = GameLoadingDialog()
gameLoadingDialog?.show(supportFragmentManager, "gameLoadingDialog") 
Run Code Online (Sandbox Code Playgroud)

然后,即使在后台也可以忽略它,您可以使用:

val prev = supportFragmentManager.findFragmentByTag("gameLoadingDialog")
if (prev != null && prev is GameLoadingDialog) {
    prev.dismissAllowingStateLoss()
}
Run Code Online (Sandbox Code Playgroud)