我正在创建一个看起来像对话框的活动。
这是风格:
<style name="TablesDialogActivity" parent="@android:style/Theme.Holo.Dialog">
<item name="android:windowBackground">@drawable/frame_background_left</item>
</style>
以下是onCreate()的活动:
protected void onCreate(Bundle savedInstanceState) {
getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL);
getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
super.onCreate(savedInstanceState);
}
还在活动触摸拦截器内部:
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
finish();
return true;
}
return false;
}
它几乎可以工作,活动在对话界限之外触摸完成,但它也与背景活动上的按钮交互,这是不好的。 onTouchEvent
上的文档说如果您使用了触摸事件,则应该返回true。我回归真实,但似乎并非如此。
答案 0 :(得分:0)
hm..interesting)
在我的应用程序中我使用片段,所以我使用DialogFragment而不是Dialog。
我创建了安全显示对话框方法
private static void showDialog(FragmentManager fragmentManager, String dialogTag, BeamDialogData data) {
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.commit();
fragmentManager.executePendingTransactions();
Fragment prev = fragmentManager.findFragmentByTag(dialogTag);
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
BeamDialog beamDialog = new BeamDialog();
beamDialog.setData(data);
beamDialog.show(fragmentManager, dialogTag);
}
public static void showDialogSafe(final FragmentManager fragmentManager, final String dialogTag,
final BeamDialogData data, Handler handler) {
handler.post(new Runnable() {
@Override
public void run() {
showDialog(fragmentManager, dialogTag, data);
}
});
}
BeamDialog是我的自定义DialogFragment
所以没有背景点击)
我希望,这对你有用)
答案 1 :(得分:0)
请注意,您还需要问题的全部代码。
除了我的解决方案内部活动背景(或只是您的应用程序的基本活动),我添加了:
private FrameLayout touchInterceptor;
@Override
protected void onPause() {
if (touchInterceptor.getParent() == null) {
((ViewGroup) findViewById(android.R.id.content)).addView(touchInterceptor);
}
super.onPause();
}
@Override
protected void onResume() {
((ViewGroup) findViewById(android.R.id.content)).removeView(touchInterceptor);
super.onResume();
}
在onCreate()
:
// For intercepting clicks from dialog like activities
touchInterceptor = new FrameLayout(this);
touchInterceptor.setClickable(true);
现在就像一个魅力! :)