use*_*232 4 android android-fragments android-dialogfragment
我遇到了 DialogFragments 的问题。我有一个活动,其中有一个按钮,单击时显示进度微调器(带有自定义视图的 DialogFragment),然后转到另一个活动。在我的第二个活动中,我有button2,onclick 会将结果发送回我之前的活动,这应该会关闭进度微调器。
\n\npublic 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n活动2
\n\npublic 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}\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n\xc2\xa0
\n这是在后台驳回的情况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)