寻找在onPause中实现模态对话框的最佳方法

时间:2017-09-19 07:25:51

标签: android dialog modal-dialog lifecycle onpause

我有EditTexts片段,用户可以更改。

我也有工具栏上的后退按钮(以及物理后退按钮)

当用户回击时,我会检查数据是否已更改以及是否已更改 - 我需要打开对话框并询问用户"是否要保存更改?"。获取点击并采取相应行动(肯定或否定答案)。

保存数据的最佳位置(可能我错了)是onPause of this fragment。

问题在于对话框 - 它不是模态的,当它显示问题并等待用户反应时 - 它下面的片段消失,之前从堆栈返回。 我需要"暂停onPause"用对话框直到用户做出选择。什么是简单(或最正确)的方式?

@Override
public void onPause() {
    if (!(text.getText().toString().equals(user.getName())))
    {
        new MaterialDialog.Builder(getActivity())
                .title("Save changes?")
                .content("You changed you personal details, save changes?")
                .cancelable(false)
                .positiveText("Save")
                .negativeText("Discard")
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                        save();
                    }})
                .show();
    }
    super.onPause();
}

如果我想在onPause之前执行此操作 - 我需要抓住工具栏的后退按钮和物理后退按钮 - 这似乎太多了。寻找优雅的方式。

谢谢

1 个答案:

答案 0 :(得分:0)

当活动进入后台时(不再显示在屏幕上),会调用onPause。

要在应用程序关闭屏幕之前显示对话框,您可以覆盖活动中的“onBackPressed”功能。

@Override
public void onBackPressed() {
    performBackPressed();
}

public void performBackPressed(){
    //show your dialog here 
    //call finish(); when done to close app
}

只要按下工具栏的后退按钮,您也可以调用performBackPressed()方法。

如果您在按下后退时尝试显示片段中的弹出窗口,则您仍然必须在活动中覆盖该方法,然后在按下后退时通知该片段。

在我的应用程序中,我在活动中有一个包含所有碎片的容器。我使用此代码获取当前活动的片段:

YourFragmentClass curFrag = (YourFragmentClass) fragmentManager.findFragmentById(R.id.fragment_container);

然后我在片段中有一个名为onBackPressed()的方法,我只是在我刚刚得到的片段上调用它。