如何在安卓上禁用Dialogfragment外部的点击?

14

我使用 extends DialogFragment

除了对话框以外,我想禁用在安卓上的点击。

我尝试使用 setCanceledOnTouchOutside(true) 但它不起作用。

请检查我的源代码。

public class QuestDialog extends DialogFragment {
   private String mainMessage = "";
   private View.OnClickListener positiveListener = null;
   private View.OnClickListener negativeListener = null;

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

   View view = inflater.inflate(R.layout.main_dialog, container, false);

   TextView textView = (TextView) view.findViewById(R.id.main_msg);
   textView.setText(mainMessage);

   Button positiveBtn = (Button) view.findViewById(R.id.dialog_positive_btn);
   Button negativeBtn = (Button) view.findViewById(R.id.dialog_negative_btn);

   positiveBtn.setOnClickListener(new View.OnClickListener() {
       @Override 
       public void onClick(View v) {
          dismiss();
          if (positiveListener != null) { 
              positiveListener.onClick(view);
          }
       }
   });
   negativeBtn.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
          dismiss();

          if (negativeListener != null) [
              negativeListener.onClick(view);
          }
       }
    });
    return view;
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.setCanceledOnTouchOutside(true);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM |
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    dialog.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
    return dialog;
 }
 public void setMessage(final String msg) {
     mainMessage = new String(msg);
 }

 public void setPositiveButton(View.OnClickListener listener) {
     positiveListener = listener;
 }

如何在Android上禁用DialogFragment外部的点击?

谢谢。


1
添加 dialog.setCancelable(false); - Divyesh Patel
1
setCanceledOnTouchOutside(false); 可以禁用对话框外部的触摸取消。 - Rameshbabu
请更清楚地提出您的问题,这样我们才能给出正确的答案。 - Rameshbabu
@Rameshbabu,就是这样。我想要除了对话框之外的区域,禁用点击功能。 - chohyunwook
6个回答

23

根据你的要求,你应该使用 setCancelable(true)

Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

不起作用,我想要除了对话框以外的点击都禁用 :) - chohyunwook
4
这句话的意思是设置对话框在触摸屏幕外部时是否可以被取消。dialog.setCanceledOnTouchOutside(true)意为允许通过触摸屏幕外部来取消对话框。 - Krzysztof Kubicki
1
dialog.setCanceledOnTouchOutside(false) 这行代码很有帮助。 - Rahmat Ihsan

11
重写 DialogFragment 中的 onCreateDialog,使用 Kotlin。
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val dialog = super.onCreateDialog(savedInstanceState)
    dialog.setCancelable(false)
    dialog.setCanceledOnTouchOutside(false)
    return dialog
}

4
在您的 DialogFragment 显示之前,使用 .setCancelable(false)进行设置。
QuestDialog questDialog = new QuestDialog();
questDialog.setCancelable(false);
questDialog.show(getSupportFragmentManager(),"Tag");

2

在onCreateView中使用setCancelable(false)(不需要Dialog.)对我很有帮助。


除了这个方法,其他的都对我没用。 - Joseph Sang

1

请使用 dialog.setCancelable(boolean) 方法。 谢谢


@chohyunwook 你应该尝试使用 dialog.setCancelable(true)。 - Krzysztof Pokrywka

0
在 Kotlin 中,您可以使用以下代码实现您的目标。
val showDialog = SelectFlatDailog()
showDialog.isCancelable = false
showDialog.show(supportFragmentManager, showFlatDialog.tag)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接