115

我在一个 android 应用程序中工作,并且正在使用 DialogFragment 来显示一个对话框,我想让该 DialogFragment 不可取消。我已将对话框可取消属性设置为 false,但仍然没有影响。

请查看我的代码并建议我一个解决方案。

public class DialogTest extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return super.onCreateDialog(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);

        return view;
    }
 }
4

6 回答 6

273
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    getDialog().setCancelable(false);

    return view;
}

而不是getDialog().setCancelable(false);你必须直接使用setCancelable(false);

所以更新的答案将是这样的

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    setCancelable(false);

    return view;
}
于 2013-05-10T10:46:13.760 回答
60

使用以下代码段

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}

如果您想禁用对话框的外侧触摸,请使用以下代码行

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
于 2013-05-10T10:44:03.340 回答
29

如果您使用警报构建器(并且可能在每种情况下都将对话框包装在 DialogFragment 中)来帮助构建对话框,请不要使用 getDialog().setCancelable(false) 或 Dialog.setCancelable(false)因为它不会工作。 使用 setCancelable(false) 如下代码所示,因为它在官方 android 文档中提到:

public void setCancelable (boolean cancelable)

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

参考: http: //developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.dialog_layout, null, false);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle("in case you want use a title").setView(view);

        AlertDialog alert = builder.create();
        // alert.setCancelable(false); <-- dont' use that instead use bellow approach
        setCancelable(false); <-  press back button not cancel dialog, this one works fine
        alert.setCanceledOnTouchOutside(false); <- to cancel outside touch

        return alert;
}
于 2014-08-16T09:23:09.603 回答
2

DialogFragment 中的简单解决方案

用过的

dialog.setCanceledOnTouchOutside(false)
于 2020-03-31T10:26:18.170 回答
0
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    AlertDialog.Builder(activity!!).apply {
        isCancelable = false
        setMessage("Your message")
        // your other adjustments
        return this.create()
    }
 }

为我工作。

最主要的是使用isCancelable = falseover setCancellable(false)
within override fun onCreateDialog()

于 2020-10-15T14:01:15.373 回答
0
/**
 * Control whether the shown Dialog is cancelable.  Use this instead of
 * directly calling {@link Dialog#setCancelable(boolean)
 * Dialog.setCancelable(boolean)}, because DialogFragment needs to change
 * its behavior based on this.
 *
 * @param cancelable If true, the dialog is cancelable.  The default
 * is true.
 */
DialogFragment.setCancelable(boolean cancelable) {
    mCancelable = cancelable;
    if (mDialog != null) mDialog.setCancelable(cancelable);
}
于 2021-04-01T09:50:25.970 回答