我有一个使用Theme.Dialog样式的活动,因此它是另一个活动上方的浮动窗口。但是,当我在对话框窗口外部(在后台活动上)单击时,对话框关闭。如何停止这种行为?
这可以为您提供帮助。这是处理外部触摸事件的一种方式:
在窗口外触摸时如何取消以活动为主题的对话框? 只是想指出,有是一种方式来获得对话框般从主题作为一个对话的活动“触摸外面取消”的行为,虽然我还没有完全调查它是否有不必要的副作用。
在创建视图之前,在Activity的onCreate()方法中,将在窗口上设置两个标志:一个将其设置为“非模态”,以允许除活动视图之外的其他视图接收事件。第二种是接收到其中一个事件已发生的通知,这将向您发送ACTION_OUTSDIE移动事件。
如果将活动的主题设置为对话框主题,则将获得所需的行为。
看起来像这样:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Make us non-modal, so that others can receive touch events. getWindow().setFlags(LayoutParams.FLAG_NOT_TOUCH_MODAL, LayoutParams.FLAG_NOT_TOUCH_MODAL); // ...but notify us that it happened. getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); // Note that flag changes must happen *before* the content view is set. setContentView(R.layout.my_dialog_view); } @Override public boolean onTouchEvent(MotionEvent event) { // If we've received a touch notification that the user has touched // outside the app, finish the activity. if (MotionEvent.ACTION_OUTSIDE == event.getAction()) { finish(); return true; } // Delegate everything else to Activity. return super.onTouchEvent(event); } }
我认为通过抓住事件而不采取任何措施,您可以防止比赛结束。但是,奇怪的是,活动对话框的默认行为是当您触摸外部时 不 关闭自身。
(PS:代码使用WindowManager.LayoutParams)