如何在外部触摸时保持对话打开并抓住外部触摸?

时间:2014-02-14 15:29:01

标签: android dialog

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

我有一个对话框,你猜对了,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 on root view,检查对话框内是否有触摸等),但是没有用。

现在我的问题是:我如何创建一个Dialog,它不会在外部点击时关闭,也不会对基础布局/活动上的按钮执行操作,但确实通知我/当用户在对话框外点击时捕获事件?

1 个答案:

答案 0 :(得分:0)

我宁愿使用自定义布局的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);
}

测试它并且它有效。