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

问题描述 投票:0回答:7

我用

extends DialogFragment

我想要除了对话框之外,禁用android上的点击。

我尝试了

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外部的点击?

谢谢。

android
7个回答
23
投票

根据您的要求,您应该使用

setCancelable(true)

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

11
投票

科特林 覆盖 DialogFragment 中的 onCreateDialog

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) (没有对话框。)对我有用


1
投票

请使用

dialog.setCancelable(boolean)
方法。 谢谢


0
投票

在 Kotlin 中你可以通过以下代码实现你的目标

val showDialog = SelectFlatDailog()
showDialog.isCancelable = false
showDialog.show(supportFragmentManager, showFlatDialog.tag)

0
投票

由于上述解决方案在我的情况下不起作用,我通过禁用对话框背景的触摸事件解决了这个问题:

clWelcomeDialog.setOnTouchListener { v, event ->
                // disable touch events on the dialog
                true
            }

clWelcomeDialog
是我的DialogFragment的约束布局。

© www.soinside.com 2019 - 2024. All rights reserved.