使用View.GONE的android视图仍然接收onTouch和onClick

时间:2011-01-18 20:55:46

标签: android view onclick visibility

这令我感到困惑:

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

你能帮助我吗?

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

9 个答案:

答案 0 :(得分:108)

您是否可以使用动画来显示/隐藏视图?当我使用具有android的动画时,我得到这种行为:fillEnabled =“true”android:fillAfter =“true” 不理解它,似乎是一个错误 - 如果我使用没有fillEnabled / fillAfter的动画,一切都按预期工作......

答案 1 :(得分:98)

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

答案 2 :(得分:8)

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

答案 3 :(得分:5)

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

答案 4 :(得分: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);
    }
}

这对我来说过去很有用。我目前不知道更好的方法。

答案 5 :(得分:1)

我会将此作为评论发布,但不幸的是我无法发表评论。因为它可能是一个可能的解决方案,我这样发布:

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

答案 6 :(得分:1)

对于那些做出上述答案且仍然没有解决问题的人,我建议从父视图中删除视图。如果需要再次显示视图,只需复制并将其添加到父视图即可。

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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