android 防止对话框(或DialogFragment)在应用程序转到后台时关闭

70gysomp  于 2023-02-02  发布在  Android
关注(0)|答案(3)|浏览(328)

我的应用向用户显示进度或AlertDialog是很常见的。如果用户将应用置于后台,然后稍后返回,我希望Dialog仍然显示。有没有办法让Android处理这个问题?我希望它要么不关闭对话框,要么在Activity恢复时自动重新打开它。
到目前为止,它看起来像是没有。我还没有找到大量的结果(大多数人遇到的问题与方向的变化,我的应用程序不允许),但很少有人问进入后台。我尝试了DialogFragment和普通Dialog的每一个排列,但他们都消失时,按下主页按钮,并从任务管理器打开应用程序。
我甚至没有任何代码可以展示,因为它都处于在线各种示例的测试阶段。我怀疑我必须自己管理这个,通过检查onResume()是否应该显示一些东西。如果是这样的话,我可以接受它,但我想确定一下。

mdfafbf1

mdfafbf11#

首先让我们清除一些东西,就像你可以在下一张图片中看到的,你的活动或片段可能会因为很多原因而被破坏,所以你必须处理你想要保存的"对话框的状态"。

下面是代码:

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);
        }
    }
}
bvjveswy

bvjveswy2#

在您的DialogFragmentonPause()中尝试此操作

@Override   
public void onPause() {
super.onPause();
getActivity().getSupportFragmentManager().beginTransaction()
               .addToBackStack("mydialogfragment").commit();
Log.v("dialog", "dialog is going down");
}

然后,在ActivityonResume()中,您可以调用DialogFragment以恢复其生命

@Override
protected void onResume() {
    super.onResume();
    getSupportFragmentManager().popBackStack();
    Log.v("activity", "onresume called - i am bringing back the dialog");
}

为什么我认为这是可行的,因为DialogFragmentFragment,并且Fragment的生命周期由父Activity控制,如user@0mach0图表所示,因此您所做的就是将其推送到反栈并回调它。因此它应该可以工作

dy2hfwbg

dy2hfwbg3#

尝试使用parentFragmentManager显示对话框。适用于我的对话框片段
.show(parentFragmentManager, "TAG")

相关问题