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:fillAfter
和 android: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的主要内容,如果未能解决你的问题,请参考以下文章
Appcenter Android Build for React-Native with Unity
Animated progress view with CAGradientLayer(带翻译)