DialogFragment setCancelable property not working

我在一个 Android 应用程序中工作,我使用一个 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;
}
}
56209 次浏览

使用下面的代码段

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

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

DialogFragment.getDialog().setCanceledOnTouchOutside(true);
@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;
}

你必须直接使用 setCancelable(false);而不是 getDialog().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;
}

如果您使用警报构建器(并且可能在每种情况下都将对话框封装在 DialogFragment 中)来帮助构建对话框,请不要使用 getDialog ()。SetCancelable (false)或 Dialog.setCancelable (false) < strong > ,因为它不会工作。 Use setCancelable(false) as shown in code below as it's mentioned in oficial android documentation:

public void setCancelable (boolean cancelable)

在 API 等级11中添加 控制显示的对话框是否可取消。使用此方法而不是直接调用 Dialog.setCancelable (boolean) ,因为 DialogFragment 需要根据此方法改变其行为。”

ref: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;
}

对话框碎片的简单解决方案

二手货

dialog.setCanceledOnTouchOutside(false)
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
AlertDialog.Builder(activity!!).apply {
isCancelable = false
setMessage("Your message")
// your other adjustments
return this.create()
}
}

对我有用。

主要的事情是在 setCancellable(false)上使用 isCancelable = false
within override fun onCreateDialog().

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