所以这在过去的几个小时里一直困扰着我。
我有一个对话框,你猜对了,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
,它不会在外部点击时关闭,也不会对基础布局/活动上的按钮执行操作,但确实通知我/当用户在对话框外点击时捕获事件?
答案 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);
}
测试它并且它有效。