我遇到了 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/