android View with View.GONE 仍然接收 onTouch 和 onClick

Posted

技术标签:

【中文标题】android View with View.GONE 仍然接收 onTouch 和 onClick【英文标题】:android View with View.GONE still receives onTouch and onClick 【发布时间】:2011-06-11 08:43:59 【问题描述】:

这让我很困惑:

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

你能帮帮我吗?

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

【问题讨论】:

这是否在调用 View.GONE 后立即发生?只在有限的时间内?这可能与 UI 更改不会立即生效有关。 我们需要更多信息。尝试使用hierarchyviewer 工具在运行时检查视图层次结构的状态。这将让您在调试视图问题时查看可见性状态等等。 谢谢。这在调用 View.GONE 后立即发生。 hierarchyviewer 工具说视图已经消失,但它仍然在点击。我的平台是 cyanogenmod 2.2(但我希望这仍然是我的代码中的一个问题:D) 没有动画我也有同样的问题。即使将 ViewGroup 中的每个元素都设置为 GONE,我仍然可以选择 GONE EditText 的内容并获取键盘。 View.GONE 后,布局元素接收 onClick() 事件。这有动画视图和消失。如何阻止这个? 【参考方案1】:

您可能会使用动画来显示/隐藏视图吗?当我使用具有 android:fillEnabled="true" android:fillAfter="true" 的动画时出现此行为 不明白,似乎是一个错误 - 如果我使用没有 fillEnabled/fillAfter 的动画,一切都会按预期工作......

【讨论】:

有没有可用的解决方法?我正在使用 Nineoldandroids 并在 API10 上看到了这种行为 - 我认为它使用 fillEnabled 来模拟动画后修改视图属性的 3.0 API 行为。 我在使用 Android Google 4.4.2 API 时也遇到了这个问题。 谢谢,确实,这对我有帮助:) 感谢提示,移除 android:fillAfter="true",使用 code @Override public void onAnimationEnd(Animation animation) /* Android will make an exception when you change the view hierarchy * in animationEnd. http://***.com/a/7445557/587186 */ new Handler().post(new Runnable() public void run() if (interventionPreview != null) interventionPreview.setVisibility(View.GONE); ); 附加动画监听器,希望对您有所帮助。 感谢您让我免于轻微头痛【参考方案2】:

如果您在某些动画(例如淡出)之后设置了setVisibility(View.GONE),那么请尝试使用clearAnimation() 清除动画。这对我有帮助。

【讨论】:

这是一个更好的答案。在某些情况下,您希望在动画中使用 android:fillAfterandroid:fillEnabled,并且希望视图停止响应。 这个对我有用,但由于我的动画会持续一两秒,所以clearAnimation() 停止动画,我看不到淡入淡出动画。而不是那个,我在我的 alpha 动画中使用了alpha.setFillAfter(false);,它完全符合我的预期。 这是最好的回答,谢谢! @osayilgan ,在这种情况下,您只需要在动画结束后设置一个 onEndAnimation 侦听器和 clearAnimation() 。 我相信这个答案比公认的更好,因为可能需要 fillAfter 行为。谢谢你,你救了我一个受伤的世界。 @osayilgan 您应该将clearAnimation() 调用放入onAnimationEnd() 方法中。然后它按预期工作。【参考方案3】:

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

【讨论】:

【参考方案4】:

是的,mview.clearAnimation() 有一些问题,但 amination.setFillAfter(false);mview.setClickable(false); 工作完美。

【讨论】:

【参考方案5】:

我期望发生的事情是您使视图不可见,但子视图仍会响应点击(即您的视图是 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);
    

这在过去对我有用。我目前不知道有更好的方法来做到这一点。

【讨论】:

8 年后,这仍然是一个问题。只要您没有其他视图,这将起作用。【参考方案6】:

我会将此作为评论发布,但不幸的是我无法发表评论。因为这对您来说可能是一个可能的解决方案,所以我以这种方式发布:

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

【讨论】:

感谢您的回复。我已经在使用 setOnClickListener 而不是 xml 标签了。【参考方案7】:

对于那些回答了上述问题但仍未解决问题的人,我建议从父视图中删除该视图。如果您需要再次显示该视图,只需制作一个副本并将其添加到父视图。

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

【讨论】:

这实际上是唯一对我有用的东西。注意:我在加载数据时使用一个视图来覆盖另一个带有BottomSheetBehavior 的视图。对于所有其他答案,视图一直在拦截触摸/手势。这打破了我的BottomSheetBehaviour |带有 design-support-lib 27.0.2 的 Android 8.0【参考方案8】:

尝试在 onAnimationEnd 覆盖中添加 .clearAnimation()。

【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于android View with View.GONE 仍然接收 onTouch 和 onClick的主要内容,如果未能解决你的问题,请参考以下文章

Android 显示view的粒子爆炸/绽放效果

Appcenter Android Build for React-Native with Unity

在 kotlin (Android ) 中发送获取请求

Animated progress view with CAGradientLayer(带翻译)

Angular 2 @View with template vs @Component with template

Angular 2 @View with template vs @Component with template