LeanbackTabLayout и LeanbackViewPager нового Leanaback не фокусируются и не меняют вкладку с помощью контроллера D-PAD

Я использую новую вкладку Leanback и ViewPager. Я не могу изменить вкладку 1 на вкладку 2 с помощью крестовины. Вкладки меняются с Tab1 на Tab2, когда я дохожу до последнего элемента фрагмента строки в Tab1. Я не могу перейти вверх из элемента rowfragment в меню Tab. Я упомянул пример кода ниже. В видео для разработчиков они могут переключать вкладки крестовиной. Пожалуйста, ответьте на это. заранее спасибо :)

мой файл build.gradle:

implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.leanback:leanback:1.0.0'
implementation "androidx.leanback:leanback-tab:1.1.0-beta01"
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.github.bumptech.glide:glide:3.8.0'

Фрагмент файла:

class CollectionDemoFragment : Fragment() {
private lateinit var demoCollectionPagerAdapter : DemoCollectionPagerAdapter
private lateinit var viewPager : LeanbackViewPager
private lateinit var tab_layout : LeanbackTabLayout

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.collection_demo, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    demoCollectionPagerAdapter = DemoCollectionPagerAdapter(childFragmentManager)
    viewPager = view.findViewById(R.id.pager)
    viewPager.setKeyEventsEnabled(true)

    tab_layout = view.findViewById(R.id.tab_layout)
    viewPager.adapter = demoCollectionPagerAdapter
    tab_layout.setupWithViewPager(viewPager)
}

}

Фрагмент XML-файла:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".CollectionDemoFragment"
android:background="@android:color/white">


<androidx.leanback.tab.LeanbackViewPager
    android:id="@+id/pager"
    android:layout_below="@+id/relativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.leanback.tab.LeanbackTabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/lb_grey"
        android:focusable="true"
        android:focusableInTouchMode="true"/>

</androidx.leanback.tab.LeanbackViewPager>

Файл адаптера:

class DemoCollectionPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getItem(position: Int): Fragment {
    val fragment = DemoObjectFragment()
    fragment.arguments = Bundle().apply {
        putInt(ARG_OBJECT, position + 1)
    }
    return fragment
}

override fun getCount(): Int = 4


override fun getPageTitle(position: Int): CharSequence {
    return "OBJECT ${(position + 1)}"
}

}

Я также просмотрел сайт разработчика и видео на YouTube: https://developer.android.com/training/tv/start/libraries#leanback-tabs-library

https://www.youtube.com/watch?v=OOV6Ef9zDg0&t=1065s в 16:40 секунд

Для большей ясности я добавил изображение экрана. На изображении я не могу перейти от Выбранный элемент -> Tab2 -> Tab3. А теперь, с другой стороны, если я, наконец, нахожусь в элементе Tab2, а затем сразу нажимаю на D-pad, и только он переходит на Tab3 и наоборот, первый элемент на Tab3, тогда я могу перейти на Tab2. Надеюсь, это прояснит мою проблему.

https://i.stack.imgur.com/Syvb1.png


person Sagar Ghare    schedule 25.01.2021    source источник


Ответы (1)


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

<androidx.leanback.tab.LeanbackTabLayout
    android:id="@+id/tab_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<androidx.leanback.tab.LeanbackViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Убедитесь, что все, что содержит эти представления, размещает их так, чтобы они не перекрывались (например, просто оберните их вертикальным LinearLayout для тестирования).

person Ian G. Clifton    schedule 26.01.2021
comment
Эй, @ian, спасибо за ответ. Я отредактировал свой вопрос, добавил новое изображение и описание проблемы. Я пробовал, к сожалению, это не сработало, как ожидалось. ‹LinearLayout› ‹tab.LeanbackTabLayout› ‹/LeanbackViewPager›‹/LinearLayout›... Теперь в developer.android.com/training/tv/start/ они упомянули Обратите внимание, что LeanbackViewPager основан на ViewPager, а не на ViewPager2. Итак, я следовал этому developer.android.com/guide/navigation/navigation-swipe-view Руководство по просмотру страниц, которое они предложили, включает TabLayout и ViewPager. я не понимаю. - person Sagar Ghare; 27.01.2021
comment
Да, должно так работать. Классы Leanback* расширяют версии без наклона и добавляют функциональность фокуса, но в остальном они одинаковы. Существует также репозиторий, который вы можете проверить на android. googlesource.com/platform/frameworks/support/+/, который содержит пример использования этих классов на случай, если это поможет устранить неполадки. - person Ian G. Clifton; 27.01.2021
comment
Привет, @lan, я клонировал проект SupportLeanbackDemos. Это демонстрация TabLayoutActivity. но этот проект не строится в студии Android. файл gradle на уровне проекта отсутствует, а плагины {id (AndroidXPlugin) не найдены ни в одном из источников 1) плагины Gradle Core и 2) репозитории плагинов.. не могли бы вы рассказать мне, как можно клонировать и запустить этот проект, чтобы увидеть результат. - person Sagar Ghare; 29.01.2021
comment
Привет, @lan G. Clifton, не могли бы вы ответить мне. - person Sagar Ghare; 01.02.2021
comment
Подключаемый модуль AndroidXPlugin находится по адресу android.googlesource.com/platform/frameworks/support/+/refs/, но может быть проще просто скопировать нужные файлы активности/фрагментов/макетов в существующий проект. чтобы протестировать с. Вы также можете попробовать не устанавливать setKeyEventsEnabled, чтобы увидеть, не мешает ли это обработке фокуса. - person Ian G. Clifton; 02.02.2021
comment
Привет, @lan G. Clifton, я просмотрел код 2 раза и выбрал необходимые классы, макет и т. Д., Но он не работает должным образом. Фокус по-прежнему не перемещается с элемента Rowfragment на элемент Tab. И, во-вторых, я попытался прокомментировать setKeyEventsEnabled(true), работает так, что предотвращает переход на следующую вкладку, если мы находимся в последнем элементе на предыдущей вкладке. так 1 вопрос решить. Я не думаю, что я делаю какую-либо ошибку копирования и вставки. Я запускаю приложение в эмуляторе. Не могли бы вы просмотреть мой код, если я загружу свой код на github. - person Sagar Ghare; 04.02.2021
comment
привет, @lan G. Clifton, не могли бы вы ответить мне. я действительно помогаю - person Sagar Ghare; 06.02.2021