iTu*_*rki 34
一种简单/愚蠢的方式:
创建一个虚拟空视图(让我们说没有源的ImageView),让它填充父
如果单击它,则执行您想要执行的操作.
您需要将XML文件中的根标记设置为RelativeLayout.它将包含两个元素:您的虚拟视图(将其位置设置为align the Parent Top).另一个是包含视图和按钮的原始视图(此视图可能是LinearLayout或您制作的任何内容.不要忘记将其位置设置为align the Parent Top)
希望这会对你有所帮助,祝你好运!
bri*_*tzl 26
这是一个老问题,但我想我会给出一个不基于onTouch事件的答案.正如RedLeader所建议的那样,使用焦点事件也可以实现这一点.我有一个案例,我需要显示和隐藏自定义弹出窗口中排列的一堆按钮,即按钮都放在同一个按钮中ViewGroup.要使其工作,您需要做的一些事情:
您要隐藏的视图组需要View.setFocusableInTouchMode(true)设置.这也可以使用XML设置android:focusableintouchmode.
您的视图根,即整个布局的根,可能是某种线性或相对布局,也需要能够按照上面的#1聚焦
显示视图组时,您调用View.requestFocus()以给予焦点.
您的视图组需要覆盖View.onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)或实现您自己的OnFocusChangeListener并使用View.setOnFocusChangeListener()
当用户点击视图外部时,焦点将转移到视图根(因为您将其设置为#2中可聚焦)或另一个本质上可聚焦(EditText或类似)的视图
使用#4中的某种方法检测焦点丢失时,您知道焦点已转移到视图组之外的某个位置,您可以隐藏它.
我想这个解决方案在所有情况下都不起作用,但它在我的特定情况下起作用,听起来好像它也适用于OP.
Kai*_*ang 25
找到视图矩形,然后检测click事件是否在视图之外.
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Rect viewRect = new Rect();
mTooltip.getGlobalVisibleRect(viewRect);
if (!viewRect.contains((int) ev.getRawX(), (int) ev.getRawY())) {
setVisibility(View.GONE);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果您想在其他地方使用触摸事件,请尝试
return super.dispatchTouchEvent(ev);
Run Code Online (Sandbox Code Playgroud)
pic*_*tor 10
我一直在寻找一种方法来触摸外面时关闭我的视图,这些方法都不能很好地满足我的需求.我找到了一个解决方案,只是发布在这里以防万一有人感兴趣.
我有一个基本活动,几乎所有我的活动都延伸.在其中我有:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (myViewIsVisible()){
closeMyView();
return true;
}
return super.dispatchTouchEvent(ev);
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我的视图可见,它将关闭,如果不是,它将表现得像普通的触摸事件.不确定这是否是最佳方式,但它似乎对我有用.