55

我有一个可以创建和弹出 DialogFragment 的 Fragment,但是当我点击后退按钮时,即使我明确调用 setCancelable(false); 也会关闭对话框;有什么办法让我的 DialogFragment 对后退按钮不敏感?

public class LoadingDialogFragment extends DialogFragment
{
    String title;
    String msg;

    public LoadingDialogFragment()
    {
        this.title = "Loading...";
        this.msg = "Please wait...";
    }
    public LoadingDialogFragment(String title, String msg)
    {
        this.title = title;
        this.msg = msg;
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState)
    {
        final ProgressDialog dialog = new ProgressDialog(getActivity());

        dialog.setTitle(title);
        dialog.setMessage(msg);
        dialog.setIndeterminate(true);
        dialog.setCanceledOnTouchOutside(false);
        dialog.setCancelable(false);

        return dialog;
    }

}

我从 AsyncTask 创建 DialogFragment:

private class GpsTask extends AsyncTask<String, Integer, Integer>
{
    //ProgressDialog dialog;
    @Override
    protected void onPreExecute()
    {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock...");
        ft.addToBackStack(null);
        newFragment.show(ft, "dialog");
    }

    @Override
    protected Integer doInBackground(String... params)
    {
        //acquire a GPS lock and grab a few position updates
    }

    @Override
    protected void onProgressUpdate(Integer... input) { }

    @Override
    protected void onPostExecute(Integer result)
    {
        getSupportFragmentManager().popBackStackImmediate();
    }
}
4

5 回答 5

135

怎么用setCancelable?你试过了吗?

从文档:

控制显示的 Dialog 是否可取消。使用这个而不是直接调用Dialog.setCancelable(boolean),因为DialogFragment需要基于这个改变它的行为

对于自定义 DialogFragment

添加isCancelable = falseonCreateDialog

于 2012-04-16T09:47:43.437 回答
8
 DialogFragment newFragment = YourFragment.newInstance();
                newFragment.setCancelable(false);
                newFragment.show(fragmentTransaction, "dialog");

在 .Show() 片段之前添加 setCancelable(false)

于 2014-06-02T10:35:46.723 回答
4

我完全不确定这是否适用于 FragmentDialogs,但如果 setCancelable 对您不起作用,则可能值得看看这篇文章:Android:按下后退按钮时提示用户保存更改

它解释了如何检测被按下的后退按钮。所以也许你可以按下按钮,它会阻止对话框关闭?

于 2012-04-16T09:55:39.940 回答
3

onCreateDialogonCreateView

实现应覆盖此类并实现 onCreateView(LayoutInflater, ViewGroup, Bundle) 以提供对话框的内容。或者,他们可以覆盖 onCreateDialog(Bundle) 以创建具有自己内容的完全自定义对话框,例如 AlertDialog。

使用时重要onCreateDialog

覆盖以构建您自己的自定义对话框容器。这通常用于显示 AlertDialog 而不是通用 Dialog;这样做时,不需要实现 onCreateView(LayoutInflater, ViewGroup, Bundle),因为AlertDialog 会处理自己的内容。

示例Dialog(在本例中为AlertDialog):

public static class MyAlertDialogFragment extends DialogFragment {

    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");

        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setCanceble(false)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((FragmentAlertDialog)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
} 

该属性setCanceble(boolean)说明您是否可以Dialog通过后按退出。无需在任何地方捕获 KEYCODE_BACK。

于 2013-03-14T15:05:55.637 回答
3

它可能会帮助你。

newFragment.setCancelable(false); 

在创建 DialogFragment 对象时或在自定义 DialogFragment 的构造函数中进行类似的更改,如下面的示例所示。

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener)
        {
            CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();            
            CustomClearHourDialog.listener = listener;
            clearHourDialog.setCancelable(false);
            return clearHourDialog;
        }
于 2016-10-13T11:38:20.997 回答