onClickListener не всегда срабатывает во фрагменте

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

У меня есть макет со списком слева и сеткой справа (показано на скриншоте). Щелчок по элементам списка слева (категории) вызывает API, возвращает некоторые материалы (фильмы) и отображает их в правой части. Затем, когда вы нажимаете на фильм в правильном фрагменте, должно произойти что-то еще.

Он работает в течение некоторого времени, ни один пользователь не жаловался, И он ДЕЙСТВИТЕЛЬНО работает на определенных устройствах... например, он работает на версии Amazon Fire, работающей под управлением Android 7.1, но не работает ни на их Android 5.1, ни на Android. 9 версий... [ОТРЕДАКТИРОВАНО 16/12/2020: см. редактирование внизу вопроса... путем изменения библиотек - возврата к более старым версиям - теперь это происходит только на устройствах Fire на базе Android 9, а старшие - и 5 и 7 - работают]

На проблемных устройствах происходит странное поведение: если вы выбираете один из первых трех элементов в списке, в сетке справа мой onClickListener не срабатывает. Начиная с 4-го элемента, срабатывает onClickListener и выполняется мой код.

Это происходит только при использовании пульта дистанционного управления / dpad ... сенсорные события также работают на первых трех ... но проблема возникает на некоторых моделях Amazon Fire TV и других Android TV, которые не имеют сенсорного экрана и должны использовать пульт (на одном эмуляторе я могу его воспроизвести, на другом - нет... даже если оба работают под управлением Android 10...)

Правильная часть состоит из фрагментов - это всегда один и тот же фрагмент, всегда один и тот же вызов API (просто другая категория в качестве параметра для вызова API), всегда один и тот же тип материала, который возвращается и должен отображаться, проходя через одно и то же. переходник, держатель и т.д.

Я теряюсь, где искать. Я даже пытался понизить версию библиотек, компилятора и т. д. Я могу поделиться фрагментами кода (хотя мне приходится много подчищать, и это все равно будет совсем немного, потому что это сложный макет со многими частями... но это очень похоже на этот set onClickListener в getview() с классом ViewHolder. Я также проверил это https://scottweber.com/2013/04/30/adding-click-listeners-to-views-in-adapters/ и я получаю точно такое же поведение...), но если бы код был действительно сломан, он НИКОГДА не работал бы ... но тот факт, что это "в целом работает", но не для первых трех элементов в списке, меня смущает... как я уже писал: это будет тот же фрагмент, тот же код... очень странно. Вот почему я подозреваю проблему с платформой/библиотекой/компилятором... ...но я не знаю, где искать...

введите здесь описание изображения

ОТРЕДАКТИРОВАНО / ОБНОВЛЕНО 16/12/2020: После того, как я отправил версию, в которой я понизил МНОЖЕСТВО библиотек И Gradle (и без изменения кода с моей стороны), я смог снова получить одобрение в магазине Amazon, но с ограниченная совместимость устройств. В основном говорят, что он работает на самых старых устройствах и ломается только на (некоторых) новых... интересно. Я до сих пор не нашел виновника, но, по крайней мере, есть какое-то направление, где искать...


person Daniele Muscetta    schedule 08.12.2020    source источник
comment
Кажется, это для Android TV, но я думаю, что стратегия приложений для Android может сработать и здесь. Вы используете RecyclerView? И пробовали ли вы настроить прослушиватель кликов непосредственно в своей деятельности, а не в адаптере. Я не знаю, так ли это работает в Android TV. Но если да, то можно попробовать.   -  person Basu    schedule 08.12.2020
comment
Это не recyclerview — это просто android.widget.GridView. Он должен отображать только 6 элементов на экране такого размера — или максимум 16. Я понимаю, что RecyclerView является текущим, более современным, более эффективным с точки зрения памяти, чем угодно... но с таким количеством элементов это действительно звучало как излишество без реального выигрыша в производительности... это прекрасно работает на очень старых устройствах до андроид 5...   -  person Daniele Muscetta    schedule 09.12.2020
comment
Активность, в которой это содержится, уже является довольно длинным фрагментом кода и содержит множество условных вариантов изменения макета в зависимости от форм-фактора (телефон/планшет/телевизор). Для списка слева есть onclicklistener, которые вызывают удаление и добавление или замену фрагментов справа. Затем, во фрагментах справа (в адаптере, который они используют), это место, где находятся прослушиватели кликов для этих элементов.... также было бы обременительно привязывать их от действия к чему-то, что действие на самом деле мало знает о или считает черный ящик: фрагменты заменяются...   -  person Daniele Muscetta    schedule 09.12.2020
comment
Я попытался добавить несколько фальшивых элементов «сверху» списка слева, и — о чудо — остальная часть, как только «перемещена вниз» таким образом, начинает работать. Смешно, даже не знаю куда смотреть...   -  person Daniele Muscetta    schedule 09.12.2020
comment
а когда они не работают, то просто с ПУЛЬТОМ он не работает..... потому что с сенсорным (если есть) проблемы не существует: он просто работает. Кроме того, с пультом на многих устройствах он все еще работает ... только на некоторых это не работает, но я не могу выделить какую-либо конкретную разницу, чтобы понять, в чем заключается фактическая, актуальная разница ...   -  person Daniele Muscetta    schedule 09.12.2020


Ответы (1)


Оказывается, если я установил

android:descendantFocusability="afterDescendants"

в GridView, то он работает более надежно.

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

Полезные другие темы, которые я просмотрел и помогли мне в правильном направлении (и мне пришлось купить новый Fire TV Stick нового поколения, чтобы иметь возможность воспроизвести и отладить его):

person Daniele Muscetta    schedule 22.12.2020