【问题标题】:How to keep dialog open on outside touch and catch outside touches?如何在外部触摸时保持对话框打开并捕捉外部触摸?
【发布时间】:2014-02-14 15:29:00
【问题描述】:

所以这在过去的几个小时里一直困扰着我。

我有一个扩展的对话框,你猜对了,Dialog。当用户在对话框之外单击时,我不想关闭对话框。这很容易,因为我可以简单地使用这一行:dialog.setCanceledOnTouchOutside(false)。但是,当用户在对话框之外触摸时,我确实想执行某些操作。对话框不关闭也很容易(How to cancel an Dialog themed like Activity when touched outside the window?):

getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);

然后实现自定义onTouchEvent(MotionEvent event)

但是,这不仅不会关闭对话框,还会对底层按钮等执行操作。我也在帖子中尝试了其他一些可能的答案(空、在根视图上返回错误的 onTouchListener、检查对话框内是否有触摸等),但无济于事。

现在我的问题是:我怎样才能创建一个Dialog,它不会在外部点击时关闭,也不会对底层布局/活动的按钮等执行操作,但会通知我/捕获一个用户在对话框外点击时的事件?

【问题讨论】:

    标签: android dialog


    【解决方案1】:

    我宁愿使用带有自定义布局的 DialogFragment。在布局中创建将填充 UI 并透明的视图组(该布局将捕获外部点击)。将您的对话框放入此布局中。

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:id="@+id/background"
                  android:gravity="center"
                  android:background="@color/transparent">
    ...
    </LinearLayout>
    

    然后在onCreateView中:

    View view = inflater.inflate(R.layout.popup_exit, container, false);
    
    LinearLayout background = (LinearLayout) view.findViewById(R.id.background);
    background.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        Log.d("ExitDialogFragment", "onBackground click");
      }
    });
    

    和 onCreate:

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar);
    }
    

    经过测试,它可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 2015-03-25
      • 2023-03-31
      • 2012-08-19
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      相关资源
      最近更新 更多