Android通过点击外部使视图消失

CQM*_*CQM 33 android view onclick back

我有一些观点,按下按钮后可以看到.如果我点击这些视图之外,我希望它们消失.

如何在Android上完成?

此外,我意识到"后退按钮"也可以帮助Android用户 - 我可能会将其作为关闭视图的第二种方式 - 但有些平板电脑甚至不再使用"物理"后退按钮,它一直非常不再强调.

iTu*_*rki 34

一种简单/愚蠢的方式:

  • 创建一个虚拟空视图(让我们说没有源的ImageView),让它填充父

  • 如果单击它,则执行您想要执行的操作.

您需要将XML文件中的根标记设置为RelativeLayout.它将包含两个元素:您的虚拟视图(将其位置设置为align the Parent Top).另一个是包含视图和按钮的原始视图(此视图可能是LinearLayout或您制作的任何内容.不要忘记将其位置设置为align the Parent Top)

希望这会对你有所帮助,祝你好运!

  • 您可以简单地使用View作为虚拟视图.它们更轻一点,只是在XML中看到它是一个很好的提醒,它不是用作视觉元素 (14认同)

bri*_*tzl 26

这是一个老问题,但我想我会给出一个不基于onTouch事件的答案.正如RedLeader所建议的那样,使用焦点事件也可以实现这一点.我有一个案例,我需要显示和隐藏自定义弹出窗口中排列的一堆按钮,即按钮都放在同一个按钮中ViewGroup.要使其工作,您需要做的一些事情:

  1. 您要隐藏的视图组需要View.setFocusableInTouchMode(true)设置.这也可以使用XML设置android:focusableintouchmode.

  2. 您的视图根,即整个布局的根,可能是某种线性或相对布局,也需要能够按照上面的#1聚焦

  3. 显示视图组时,您调用View.requestFocus()以给予焦点.

  4. 您的视图组需要覆盖View.onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)或实现您自己的OnFocusChangeListener并使用View.setOnFocusChangeListener()

  5. 当用户点击视图外部时,焦点将转移到视图根(因为您将其设置为#2中可聚焦)或另一个本质上可聚焦(EditText或类似)的视图

  6. 使用#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)

  • 什么是“mToolTip”? (3认同)
  • 需要注意的是,`dispatchTouchEvent()`应该返回一个布尔值,但是你的示例中没有返回任何内容.此外,您没有定义或解释`viewRect`是什么. (2认同)

pic*_*tor 10

我一直在寻找一种方法来触摸外面时关闭我的视图,这些方法都不能很好地满足我的需求.我找到了一个解决方案,只是发布在这里以防万一有人感兴趣.

我有一个基本活动,几乎所有我的活动都延伸.在其中我有:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (myViewIsVisible()){
            closeMyView();
        return true;
    }
    return super.dispatchTouchEvent(ev);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我的视图可见,它将关闭,如果不是,它将表现得像普通的触摸事件.不确定这是否是最佳方式,但它似乎对我有用.

  • 当您的视图可见并且您点击它时会发生什么?看起来它无论如何都会关闭它 (6认同)