当应用程序转到后台时,阻止对话框(或DialogFragment)关闭

Mar*_*her 8 android android-dialog android-dialogfragment

我的应用程序显示进度或AlertDialog用户非常常见.如果用户将应用程序放入后台然后稍后返回,我希望Dialog仍然显示该应用程序.有没有办法让Android处理这个?我想它要么不关闭对话框,要么在Activity恢复时自动重新打开它.

到目前为止它看起来像没有.我没有找到大量关于此的结果(大多数人遇到方向更改的问题,我的应用程序不允许),但很少有人询问进入后台.我已经尝试了DialogFragment常规的每个排列Dialog,但是当按下主页按钮并且从任务管理器打开应用程序时,它们都会消失.

我甚至没有任何代码可以展示,因为它们都处于在线各种示例的测试阶段.我怀疑我必须自己管理这个,通过签入onResume()是否应该显示的东西.如果是这种情况我可以忍受它,但我想知道肯定.

Mig*_*ieC 4

首先让我们清除一些内容,就像您在下图中看到的那样,您的活动或片段可能会因多种原因而被破坏,因此您必须处理您想要保存“对话框状态”的内容。

活动生命周期 在此输入图像描述

现在的代码:

public class CustomProgressDialog extends Dialog {

    private static final String SHOWING_PROGRESS_DIALOG = "showing_progress_dialog";
    private static final String STRING_PROGRESS_DIALOG = "string_progress_dialog";
    private static final String SHOWING_POP_UP_DIALOG = "showing_pop_up_dialog";
    private static final String STRING_POP_UP_DIALOG = "string_pop_up_dialog";

    public TextView textView;

    public CustomProgressDialog(Context context) {
        super(context, android.R.style.Theme_Translucent_NoTitleBar);

        setContentView(R.layout.progress_layout);

        setCancelable(false);

        textView = (TextView) findViewById(R.id.progress_textView);
    }

}


public class MasterActivity extends FragmentActivity {
    private CustomProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_master);

        progressDialog = new CustomProgressDialog(this);

        if (savedInstanceState != null) {
            boolean showingDialog = savedInstanceState.getBoolean(SHOWING_PROGRESS_DIALOG);
            if (showingDialog) {
                String msg = savedInstanceState.getString(STRING_PROGRESS_DIALOG, getResources().getString(R.string.progress_default_text));
                progressDialog.textView.setText(msg);
                progressDialog.show();
            }

            boolean mShowing_PopUpdialog = savedInstanceState.getBoolean(SHOWING_POP_UP_DIALOG);
            String temp_msg = savedInstanceState.getString(STRING_POP_UP_DIALOG, "");

            if (mShowing_PopUpdialog)
                showPopUpDialog(temp_msg);
            }
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (progressDialog.isShowing()) {
            outState.putBoolean(SHOWING_PROGRESS_DIALOG, true);
            outState.putString(STRING_PROGRESS_DIALOG, progressDialog.textView.getText().toString());
        }

        if (alert != null && alert.isShowing()) {
            outState.putBoolean(SHOWING_POP_UP_DIALOG, true);
            outState.putString(STRING_POP_UP_DIALOG, mString_dialog);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)