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

时间:2015-04-28 22:11:04

标签: android android-dialogfragment android-dialog

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

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

我甚至没有任何代码可以显示,因为它们都处于在线各种示例的测试阶段。我怀疑如果要显示某些内容,我必须通过检查onResume()来自行管理。如果是这种情况,我可以忍受它,但我想肯定地知道。

2 个答案:

答案 0 :(得分:3)

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

activity life cycle enter image description here

现在代码:

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

答案 1 :(得分:0)

DialogFragment onPause()执行此操作

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

然后在Activity onResume()中,您致电DialogFragment恢复生机

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

为什么我认为这可行有效DialogFragmentFragmentFragment的生命周期由父Activity控制为用户@ 0mach0图表显示,所以你要做的就是推它做后台堆栈并回拨它。所以它应该工作