我有一个活动可以在运行时显示不同的对话框.我使用onCreateDialog(int id)来创建每个对话框,我使用showDialog(int id)和dismissDialog(int id)方法分别显示和关闭每个对话框.
当调用onPause()时,我不知道正在显示哪个对话框(如果有).我想确保在调用onPause时,所有对话框都会被忽略.是否有推荐的方法来解雇所有对话框?我是否必须为每个对话框调用dismissDialog()?
Dom*_*icz 25
如果您正在使用DialogFragment,并且想要解雇所有可以使用的内容:
/**
* Dismiss all DialogFragments added to given FragmentManager and child fragments
*/
public static void dismissAllDialogs(FragmentManager manager) {
List<Fragment> fragments = manager.getFragments();
if (fragments == null)
return;
for (Fragment fragment : fragments) {
if (fragment instanceof DialogFragment) {
DialogFragment dialogFragment = (DialogFragment) fragment;
dialogFragment.dismissAllowingStateLoss();
}
FragmentManager childFragmentManager = fragment.getChildFragmentManager();
if (childFragmentManager != null)
dismissAllDialogs(childFragmentManager);
}
}
Run Code Online (Sandbox Code Playgroud)
mhr*_*dek 14
取决于我们谈论的对话框数量.简短的回答是肯定的,你必须解雇每个对话框.
除了在活动级别声明一些对话框之外,可能还有一些优雅的方法.您可以在声明后将所有对话框存储在HashMap中,然后遍历列表并关闭每个对话框onPause.
由于您不知道哪些是开放的,您需要通过并测试或跟踪状态.
但是,如果您在屏幕上真的有这么多对话框,那么您的UI/UX设计可能会遇到一些问题,因为Android应该为您提供一个模型,这样可以轻松实现它而不会出现设计不佳的情况.
随着android最近强调使用DialogFragment容器,你不需要在每个容器上调用dismiss
由于对话框将具有Fragment容器,因此您可以简单地使用它们的生命周期.考虑一下这个DialogFragment:
public class FragDialog extends DialogFragment{
public ProgressDialog _dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
//this.dismiss(); <-- The dialogs may be dismissed here
}
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
_dialog = new ProgressDialog(getActivity());
return _dialog;
}
@Override
public void onPause() {
super.onPause();
// <--------- You may overload onPause
}
}
Run Code Online (Sandbox Code Playgroud)
您将使用fragmentmanager在您的活动中显示哪个通常会像这样调用它:
FragmentManager fm = getSupportFragmentManager();
FragDialog fragDialog = new FragDialog();
fragDialog.show(fm, "my_tag");
Run Code Online (Sandbox Code Playgroud)
请注意,您实际上可能会更改DialogFragment在onPause中执行的操作.当您的活动调用onPause时,也会调用此onPause.
使用this.dismiss()在onPause()中关闭对话框将无法完成工作,因为一旦活动恢复,它也将恢复对话框.(我认为这是因为savestate存储在onPause之前).
但是,如果检测到代码中显示的savedInstanceState(简历),则可以安全地关闭onCreate中的对话框.
| 归档时间: |
|
| 查看次数: |
24692 次 |
| 最近记录: |