Android View с View.GONE по-прежнему получает onTouch и onClick

Это меня путает:

Насколько я читал, view with setVisibility (View.GONE); не должны получать больше событий касания или щелчка. Мой макет состоит из двух частей, которые будут видны или исчезнут, так что только один из них будет видимым и пригодным для использования одновременно, но View.GONE не делает этого. Я не вижу вид GONE, как и ожидалось, но он по-прежнему реагирует на onClick (и потребляет событие, которое должно получить другое представление).

Можете ли вы мне помочь?

Может быть интересен: Когда я запускаю свой проект, один вид GONE, другой видный. На этот раз он будет работать, как ожидалось (вид GONE в основном игнорируется), но после установки View.GONE через код он перестанет работать.

Ответ 1

Возможно, вы используете анимацию для отображения/скрытия представлений? Я получаю это поведение, когда я использую анимации с андроидом: fillEnabled = "true" android: fillAfter = "true" Не понимаю этого и кажется ошибкой - если я использую анимацию без fillEnabled/fillAfter, все работает как ожидалось...

Ответ 2

Если вы установили setVisibility(View.GONE) после некоторой анимации (например, погаснуть), попробуйте очистить анимацию с помощью clearAnimation(). Это помогло мне.

Ответ 3

Попробуйте установить свойство clickable в false с помощью setClickable (false) после setVisibility (View.GONE)

Ответ 4

Да, mview.clearAnimation() имеют некоторые исходы, но amination.setFillAfter(false); и mview.setClickable(false); WORKS отлично.

Ответ 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);
    }
}

Это работало для меня в прошлом. В настоящее время я не знаю лучшего способа сделать это.

Ответ 6

Я бы разместил это как комментарий, но, к сожалению, я не смог опубликовать комментарий. Поскольку это может быть возможным решением для вас, я отправляю его так:

Когда вы пишете "onClick", я предполагаю, что вы используете атрибут onClick в своем XML-макете. Попробуйте установить OnClickListener с помощью setOnClickListener вместо атрибута onClick. Возможно, это помогает...

Ответ 7

попробуйте добавить .clearAnimation() в переопределение onAnimationEnd.

Ответ 8

Если у вас есть анимация в представлении, вы должны вызвать view.clearAnimation.

Ответ 9

Для тех, кто сделал ответы выше и все еще не решил свои проблемы, я рекомендую удалить представление из родительского представления. Если вам нужно снова отобразить представление, просто сделайте копию и добавьте ее в родительский вид.

Это может показаться излишним, но я скрывал/показывал целые группы просмотра, в вашем случае это может быть кнопка, текстовое изображение или изображение, это решение все равно будет работать.