带有View.GONE的Android View仍会收到onTouch和onClick


76

这使我感到困惑:

据我所读,一个带有setVisibility(View.GONE);的视图;不应再收到任何触摸或点击事件。我的布局有两个部分,这两个部分将是可见的或消失的,因此一次只能显示和使用其中的一个,但是View.GONE并不能解决问题。我没有看到GONE视图,正如预期的那样,但是它仍然会对onClick做出反应(并消耗其他视图应该获得的事件)。

你能帮助我吗?

可能感兴趣:当我开始项目时,一个视图已消失,另一个视图可见。这次它将按预期工作(基本上将忽略GONE视图),但是在通过代码设置View.GONE之后,它将停止工作。


1
调用View.GONE之后会立即发生这种情况吗?仅在有限的时间内?UI更改不会立即生效,这可能与事实有关。
谢丽尔·西蒙

1
我们需要更多信息。尝试使用该hierarchyviewer工具在运行时检查视图层次结构的状态。在调试视图问题时,这将使您看到可见性状态以及更多其他信息。
adamp 2011年

谢谢。这是在调用View.GONE之后立即发生的。hierarchyviewer工具表示该视图已消失,但仍处于onClick的状态。我的平台是cyanogenmod 2.2(但我希望这在我的代码中仍然是一个问题:D)
ShadowMare

没有动画我也有同样的问题。即使将ViewGroup中的每个元素都设置为GONE,我仍然可以选择GONE EditText的内容并获取Keyboard。
菲利普2014年

在View.GONE之后,布局元素将接收onClick()事件。这具有“动画视图”和“消失”。如何阻止呢?
Mikalaj Susla

Answers:


112

您是否可以使用动画来显示/隐藏视图?当我使用具有android:fillEnabled =“ true”的动画时,会出现这种现象。android:fillAfter =“ true”无法理解它,并且似乎是一个错误-如果我使用不具有fillEnabled / fillAfter的动画,则所有效果都将达到预期。 ..


2
有没有其他解决方法?我正在使用nineoldandroids,并在API10上看到了此行为-我认为它使用fillEnabled来模拟3.0 API在动画后修改视图属性的行为。
拉斐尔·诺布雷

1
我也遇到了Android Google 4.4.2 API的问题。
GuilhE 2014年

谢谢你,没错,这对我有帮助:)
Android Noob 2015年

感谢您的提示,删除android:fillAfter =“ true”,将动画侦听器附加code @Override public void onAnimationEnd(Animation animation) { /* Android will make an exception when you change the view hierarchy * in animationEnd. http://stackoverflow.com/a/7445557/587186 */ new Handler().post(new Runnable() { public void run() { if (interventionPreview != null) { interventionPreview.setVisibility(View.GONE); } } }); } 到该操作中,希望对您有所帮助。
fox

感谢您让我免于轻微的头痛
Koen Van Looveren

108

如果您setVisibility(View.GONE)在动画后设置(例如淡出),请尝试使用清除动画clearAnimation()。这就是帮助我的原因。


3
这是一个更好的答案。有些情况下要使用场景android:fillAfter,并android:fillEnabled在你的动画和你想要的视图停止响应。
米克·伯恩

1
这对我有用,但是由于我的动画将持续一两秒钟,然后clearAnimation()停止动画,因此我看不到淡入淡出动画。而不是那个,我alpha.setFillAfter(false);在我的alpha动画中使用了它,并且效果完全符合我的预期。
osayilgan

9
这是最好的请求,谢谢!@osayilgan,在这种情况下,您只需要在动画结束后在其中设置onEndAnimation侦听器和clearAnimation()即可。
拉斐尔·诺布雷

我相信这个答案比公认的答案更好,因为可能需要fillAfter行为。谢谢,您救了我一个世界。
ssawchenko 2013年

2
@osayilgan,您应该将clearAnimation()call放入onAnimationEnd()方法。然后它按预期工作。
Saran 2014年

8

尝试在setVisibility(View.GONE)之后使用setClickable(false)将clickable属性设置为false



2

我期望发生的事情是,您使视图不可见,但是视图子级仍然响应点击(即,您的视图是ViewGroup)。您可以按照以下方式进行操作:

private void hideTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            hideTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.GONE);
    }
    else {
        v.setClickable(false);
        v.setVisibility(View.GONE);
    }
}

当然那你也必须做相反的事情

private void showTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            showTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.VISIBLE);
    }
    else {
        v.setClickable(true);
        v.setVisibility(View.VISIBLE);
    }
}

过去这对我有用。我目前不知道一种更好的方法。


1
8年后,这仍然是一个问题。只要您没有其他视图,此方法都将起作用。
Tamoxin19年

1

我本来可以发表评论,但是很遗憾,我无法发表评论。由于这可能是您可能的解决方案,因此我将其发布为:

当您编写“ onClick”时,我假设您正在onClickXML布局中使用该属性。尝试设置OnClickListenerwithsetOnClickListener而不是onClick属性。也许这有帮助...


谢谢您的回复。我已经在使用setOnClickListener而不是xml标签。
ShadowMare

1

对于那些已完成上述答案但仍未解决问题的用户,建议从父视图中删除该视图。如果需要再次显示该视图,只需复制一份并将其添加到父视图。

这可能看起来有些矫kill过正,但是在您的情况下,我隐藏/显示了整个视图组,可能是按钮,文本视图或图像,此解决方案仍然有效。


2
这实际上是唯一对我有用的东西。注意:BottomSheetBehavior加载数据时,我使用的是一个视图来覆盖另一个视图。在所有其他答案的情况下,视图始终截取触摸/手势。这打破了我的BottomSheetBehaviour| 安卓8.0与设计支持-lib的27.0.2
Entreco


0

如果视图上有动画,则应调用view.clearAnimation。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.