Android: невидимые объекты по-прежнему кликабельны

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

Что я обнаружил, так это то, что объекты сзади, которые были установлены как невидимые, все еще вызывают щелчки. Они не обрабатывают код, связанный с нажатием, но они как бы на мгновение снова появляются, а затем снова мгновенно исчезают при нажатии.

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

Я использую просто:

object.setVisibility(View.VISIBLE);

И:

object.setVisibility(View.INVISIBLE);

Чтобы мои предметы появлялись и исчезали. Разве это не то, чем я должен заниматься?

РЕДАКТИРОВАТЬ:

Люди продолжают спрашивать у меня точно такой же код, который они мне дают. Это код, который мне дали, и который я использую в настоящее время.

        btnLifePlus5.setVisibility(View.GONE);
        btnLifePlus5.setFocusableInTouchMode(false);
        txtLifePlus5.setVisibility(View.GONE);
        txtLifePlus5.setFocusableInTouchMode(false);
        btnLifePlus1.setVisibility(View.GONE);
        btnLifePlus1.setFocusableInTouchMode(false);
        txtLifePlus1.setVisibility(View.GONE);
        txtLifePlus1.setFocusableInTouchMode(false);
        btnLifeMinus5.setVisibility(View.GONE);
        btnLifeMinus5.setFocusableInTouchMode(false);
        txtLifeMinus5.setVisibility(View.GONE);
        txtLifeMinus5.setFocusableInTouchMode(false);
        btnLifeMinus1.setVisibility(View.GONE);
        btnLifeMinus1.setFocusableInTouchMode(false);
        txtLifeMinus1.setVisibility(View.GONE);
        txtLifeMinus1.setFocusableInTouchMode(false);

Это не имеет значения, если просто сделать их невидимыми.


person Bisclavret    schedule 21.08.2015    source источник


Ответы (6)


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

Если вы вообще не хотите его использовать, измените его на View.GONE

Разница в View.INVISIBLE и View.GONE: невидимые объекты продолжают использовать назначенное им пространство, в то время как объект, установленный как View.GONE, покидает пространство пространства, как если бы его не было на экране.

Использовать

object.setVisibility(View.GONE);

скорее, чем

object.setVisibility(View.INVISIBLE);
person Rohit5k2    schedule 21.08.2015
comment
Благодарю за ваш ответ. Я заменил все экземпляры INVISIBLE на GONE в действии. Я перезапустил приложение и снова проверил. Такое же поведение существует. Никаких изменений не произошло. Когда я нажимаю на место, где, как известно, существует объект GONE, он на мгновение снова появляется на экране. - person Bisclavret; 21.08.2015
comment
Тогда проблема в чем-то другом. Пожалуйста, опубликуйте свой код. - person Rohit5k2; 21.08.2015
comment
Код, который я использую, точно такой же, как обсуждалось выше. командирFrame.setVisibility(View.GONE); чтобы он исчез, и commandFrame.setVisibility(View.VISIBLE); чтобы он вернулся. Это действие состоит из 467 страниц документа Word с кодом. Этот код не связан с этими двумя строками. Очевидно, что INVISBLE и GONE работают некорректно или в Android есть ошибка при работе с ними. Кажется, мне нужна альтернатива обоим этим методам. - person Bisclavret; 21.08.2015
comment
Используете ли вы какую-либо анимацию, скрывая представление? - person Rohit5k2; 21.08.2015
comment
Нигде в приложении не используется анимация. - person Bisclavret; 21.08.2015
comment
я использую анимацию, чтобы скрыть свою панель, и ни одно из решений не работает (GONE или serClickable(false)). Любая идея? - person rmpt; 21.09.2018

Используйте object.setVisibility(View.GONE); вместо object.setVisibility(View.INVISIBLE);

View.GONE Означает, что это представление невидимо и не занимает места для макета.

View.GONE Это представление невидимо и не занимает места для макета.

View.INVISIBLE Это представление невидимо, но оно по-прежнему занимает место для макета.

Я надеюсь, что это поможет вам.

person IntelliJ Amiya    schedule 21.08.2015
comment
Благодарю за ваш ответ. Я заменил все экземпляры INVISIBLE на GONE в действии. Я перезапустил приложение и снова проверил. Такое же поведение существует. Никаких изменений не произошло. Когда я нажимаю на место, где, как известно, существует объект GONE, он на мгновение снова появляется на экране. - person Bisclavret; 21.08.2015
comment
@Bisclavret Пожалуйста, создайте для этого другой макет и примените это правило - person IntelliJ Amiya; 21.08.2015
comment
Вы имеете в виду использовать другой тип макета? Какой тип макета, который вы предлагаете, сделает объект GONE действительно GONE? Наверняка это не связано. - person Bisclavret; 21.08.2015
comment
@Bisclavret Затем установите setEnabled (false) - person IntelliJ Amiya; 21.08.2015
comment
установитьFocusableInTouchMode (ложь); - person IntelliJ Amiya; 21.08.2015
comment
В ближайшее время я попробую метод setFocusableInTouchMode и дам вам знать, спасибо. - person Bisclavret; 21.08.2015
comment
Это все равно не имеет никакого значения. Код, вставленный выше в исходный вопрос, обратите внимание, что это точный код, который вы мне дали. Когда я нажимаю на пустое место, где были эти элементы, все они снова появляются на полсекунды, а затем снова исчезают. Это все больше и больше похоже на ошибку ОС Android. - person Bisclavret; 21.08.2015

Попробуйте: object.setClickable(false); В качестве альтернативы вы можете: object.setEnabled(false);

person Fustigador    schedule 21.08.2015
comment
Пробовали оба этих метода. Ни один из них не решает проблему. Спасибо за попытку, это похоже на ошибку ОС. - person Bisclavret; 21.08.2015

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

Обычно я делаю так, чтобы объект А исчезал, а объект Б появлялся. Когда я нажимаю на пространство, ранее занятое объектом А, он на мгновение снова появляется на экране, а затем снова исчезает. Это выглядит ужасно. Последующие клики не воспроизводят эту ошибку, пока в следующий раз я не заставлю объект А исчезнуть.

Исправление состоит в том, чтобы заставить объект A исчезнуть, сделать новую панель просмотра видимой поверх него, а затем сделать так, чтобы объект B появился поверх панели просмотра. Таким образом, панель действует как своего рода барьер между скрытым объектом и взаимодействием с пользователем. Пользователь даже не знает, что эта панель просмотра вообще существует, поскольку она сливается со стандартным фоном, но когда я теперь нажимаю на место, где должен быть объект A, он больше не мигает обратно на экран. Хотя это плохое решение для использования, эта ОС содержит ошибки, и у меня не осталось выбора.

Моя деятельность теперь выглядит так, как будто она совершенно стабильна и работает отлично. Мне это не нравится, но это работает.

Большое спасибо, гугл.

person Bisclavret    schedule 24.08.2015
comment
У меня такая же нелепая проблема. Я думаю, вы спасли меня от нескольких часов поиска! - person F.Mysir; 13.01.2021

Попробуйте object.setVisibility(View.GONE)

View.GONE не позволяет представлению отрисовывать границы макета (ширину и высоту), тогда как View.INVISIBLE отрисовывает его.

person Malwinder Singh    schedule 21.08.2015
comment
Благодарю за ваш ответ. Я заменил все экземпляры INVISIBLE на GONE в действии. Я перезапустил приложение и снова проверил. Такое же поведение существует. Никаких изменений не произошло. Когда я нажимаю на место, где, как известно, существует объект GONE, он на мгновение снова появляется на экране. - person Bisclavret; 21.08.2015

Вы должны использовать:

object.setVisibility(View.GONE);

View.GONE полностью удаляет ваше представление из макета, но View.INVISIBLE только делает ваше представление невидимым, но все еще находится в вашем макете, поэтому на него можно кликнуть.

person Hussein El Feky    schedule 21.08.2015