Android View с View.GONE по-прежнему получает onTouch и OnClick - PullRequest
73 голосов
/ 18 января 2011

Меня смущает:

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

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

Ответы [ 9 ]

108 голосов
/ 13 марта 2011

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

98 голосов
/ 14 октября 2011

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

8 голосов
/ 03 февраля 2011

Попробуйте установить для свойства clickable значение false, используя setClickable (false) после setVisibility (View.GONE)

5 голосов
/ 04 февраля 2015

Да, mview.clearAnimation() есть некоторые проблемы, но amination.setFillAfter(false); и mview.setClickable(false); РАБОТАЕТ идеально.

2 голосов
/ 17 февраля 2011

Я ожидаю, что произойдет, что вы сделаете представление невидимым, но дети пока что реагируют на клики (т.е. ваше представление - это 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 голос
/ 01 марта 2016

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

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

1 голос
/ 21 января 2011

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

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

0 голосов
/ 25 марта 2015

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

0 голосов
/ 18 декабря 2014

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

...