DialogFragment setCancelable属性不起作用


101

我在android应用程序中工作,并且正在使用DialogFragment显示对话框,并且我想使DialogFragment不可取消。我已经将对话框的cancelable属性设置为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;
    }
 }

28
代替getDialog()。setCancelable(false); 您应该调用setCancelable(false);
Blackbelt

如果您在对话框的边界之外单击,它是否也必须消失?
乌斯曼·库德

?你在冰淇淋三明治试图请参阅链接提到fantasypublishings.com/morePhpHelp/...
Remmyabhavan

Answers:


238
@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;
}

谢谢,这真是一个不可思议的提示。我不知道为什么要用dialog.getWindow()。requestFeature(-)来在getWindow上“包含对话框”?
Fattie 2014年

7
这不是小费。片段包装了对话框,通常必须处理片段而不是对话框本身;)
andrea.rinaldi 2015年

1
如果您不覆盖onCreateView,则还可以从公共对话框onSetDialog(bundle savedInstanceState)中调用setCancelable(false)
user2924714 2015年

2
不为我工作。单击返回按钮后,对话框仍然关闭。
Pinkesh Darji'5

@Blackbelt我有一个类似的用例,但就我而言,对话框外部的触摸不会关闭该对话框。我在DialogFragment中使用DatePicker。在上面的答案中,我将对“ R.layout.dialog_test”使用什么?我充分的问题是列在这里: stackoverflow.com/questions/59825258/...
AJW

51

使用以下代码段

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

如果要禁用对话框的外部触摸,请使用以下代码

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
这应该是可接受的答案,因为它适用于原始警报对话框片段和自定义对话框片段。
Ganesh Mohan

29

如果您使用警报生成器(可能在每种情况下都将对话框包装在DialogFragment中)来帮助构建对话框,请不要使用getDialog()。setCancelable(false)或Dialog.setCancelable(false),因为这样做不会工作。 使用setCancelable(false),如下面的代码所示(在正式的android文档中已提及):

public void setCancelable (boolean cancelable)

API级别11中已添加控制显示的对话框是否可取消。使用此替代直接调用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;
}

是的,我尝试了上述解决方案,即使已检查的解决方案也对我不起作用,该答案是新的,因此需要时间进行投票表决,谢谢。
Xenione 2014年

好吧,这是对的,即使我认为从Android的角度来看这种行为很奇怪,例如当您显式使用AlertDialog.Builder来构建对话框时,您仍会认为这些属性会覆盖子类。但是我也许在这里错过了什么?
罗伯特

我认为对话框的行为在被包裹在一个dialogfragment中后不再响应AlertDialog了,或者在提神的时候没有反应。我认为一切都通过fragmentDialog。
Xenione 2014年

谢谢!我一直在使用alert.setCancelable(false),无法理解为什么它不起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.