Прежде всего, я работал в течение 3 лет над AndroidTv, борясь с управлением фокусом, на самом деле это довольно просто, проблема в том ... нет документации!
На Android -ТВ право Способ управления навигацией Dpad заключается в использовании метода focusSearch. Что это делает?
DPad навигация фактически означает, что фокус изменяется между некоторыми представлениями. Итак, кто должен решить, где фокус должен go, когда вы нажимаете Dpad-Right? ViewGroup (родитель), содержащий представления, делает!
Небольшой фон: когда представление не знает, кто должен получить фокус, оно просит ViewGroup принять решение. Поэтому в большинстве случаев, когда вы выполняете sh DpadRight, находясь в фокусе на представлении, focusSearch вызывается для его контейнера с direction = FOCUS_RIGHT (FOCUS_END) и т. Д.
Решение для ты тогда довольно прост. У вас есть 2 способа: 1. Поместить Recyclerview в BrowseFrameLayout, тогда вы можете сделать следующее
BrowseFrameLayout browseFrameLayout = view.findViewById(R.id.recyclerview_container);
RecyclerView recyclerView = view.findViewById(R.id.categories_rv);
theBrowseFrameLayout.setOnFocusSearchListener(new BrowseFrameLayout.OnFocusSearchListener() {
@Override
public View onFocusSearch(View focused, int direction) {
if (recyclerView.hasFocus())
return focused; // keep focus on recyclerview! DO NOT return recyclerview, but focused, which is a child of the recyclerview
else
return null; // someone else will find the next focus
}
});
Вы можете создать собственное представление, расширяющее любой контейнер, который вы используете для своего повторного просмотра, и сделать то же самое, вот немного более сложный пример, который мы используем с пользовательским интерфейсом, имеющим верхнее меню и различные фрагменты под ним
https://gist.github.com/RedLann/bfaffc06eb0f571234c6e46b697d633b ПРИМЕЧАНИЕ. Обычно в xml мы используем на представлении реселлера android:descendantFocusability="afterDescendants"
ПРИМЕЧАНИЕ. Просто для того, чтобы вы знали, когда представление фокусируется в первый раз, существует метод этого представления. это называется:
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect)
ПРИМЕЧАНИЕ. Если вы используете этот подход, управление фокусом становится действительно простым, каждое родительское представление (ViewGroup / Container) будет управлять фокусом для своих прямых потомков, когда это не так. не знает, что делать, он может делегировать свою родительскую группу просмотра, возвращая super.focusSearch