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
Для тех, кто сделал ответы выше и все еще не решил свои проблемы, я рекомендую удалить представление из родительского представления. Если вам нужно снова отобразить представление, просто сделайте копию и добавьте ее в родительский вид.
Это может показаться излишним, но я скрывал/показывал целые группы просмотра, в вашем случае это может быть кнопка, текстовое изображение или изображение, это решение все равно будет работать.