我custom dialog
位于Activty
内的ActivityGroup
。
我希望在外面点击时关闭对话框,并尝试在网上找到的所有内容使其正常工作..
我已经尝试了setCanceledOnTouchOutside(true)
- 没有工作
我试过了:
public boolean onTouchEvent ( MotionEvent event ) {
// I only care if the event is an UP action
if ( event.getAction () == MotionEvent.ACTION_UP ) {
// create a rect for storing the window rect
Rect r = new Rect ( 0, 0, 0, 0 );
// retrieve the windows rect
this.getWindow ().getDecorView ().getHitRect ( r );
Log.i(r.toShortString(),r.toShortString());
// check if the event position is inside the window rect
boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () );
// if the event is not inside then we can close the activity
if ( !intersects ) {
// close the activity
this.dismiss ();
// notify that we consumed this event
return true;
}
}
它也没有用。
正如我在LogCat中看到的那样 - 我认为由于某种原因对话窗口大小已完全筛选出为什么我没有"外部"触摸..
我认为它可能需要对活动组做些什么..有什么建议吗?
答案 0 :(得分:2)
好的,经过多次思考后我找到了最简单的解决方案:
问题:
出于某种原因 - 虽然我使用的主题是对话而不是全屏显示 - getWindow().getDecorView()
会返回一个覆盖整个屏幕的视图。
解决方案:
在我的XML文件中,我给了根元素一个id,我已经改变了上面的函数,如下所示:
private View rootView;
public BaseDialog(Context context, int theme) {
super(context, theme);
//I don't think the next 2 lines are really important - but I've added them for safety
setCancelable(true);
setCanceledOnTouchOutside(true);
}
public void setRootView(int resourceId)
{
this.rootView = findViewById(resourceId);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Rect rect = new Rect();
rootView.getHitRect(rect);
if (!rect.contains((int)event.getX(), (int)event.getY()))
{
this.dismiss();
return true;
}
return false;
}
希望它会帮助某人...... :)