DialogFragment setCancelable属性不起作用

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

请看我的代码,并build议我一个解决scheme。

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

使用下面的代码片段

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

如果你想禁用外围触摸对话框使用下面的代码行

 DialogFragment.getDialog().setCanceledOnTouchOutside(true); 

如果你使用了alert builder(可能在任何情况下你把对话框包装在一个DialogFragment中)来帮助build立你的对话框,请不要使用getDialog().setCancelable(false)或Dialog.setCancelable(false), 因为它不会工作。 使用setCancelable(false),如下面的代码所示,因为它是在android文档中提到的:

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