Выход из вкладки ViewPager с помощью компонентов навигации - PullRequest
0 голосов
/ 07 августа 2020

Сначала несколько уточнений. Рассмотрев множество других связанных вопросов, давайте начнем с того, чем это не является:

  • Это не о BottomNavigation
  • Это не о работе ViewPager с использованием компонентов навигации ( как этот )

Это вопросы о том, как использовать компоненты навигации, когда Viewpager является одним из компонентов.

Ситуация состоит из 3 вкладок: TabA, TabB и TabC Также есть 2 дополнительных фрагмента: FragA, FragB

Как связать их все, чтобы: ViewPagerAdapter передавал TabA, TabB и TabC И nav_praph обрабатывал перемещение из:

  • TabA -> FragA
  • TabB -> FragB
  • Tab C -> FragA (не опечатка)

Желаемое поведение пользовательского интерфейса desired state. Fragment opens above the viewpager First Option: The best I could get working was define the FragHost inside one of the tabs (e.g. TabA) and then navigate to FragA. Problem was the navigation was done INSIDE the tab. Meaning user would still see the tabs on top, and also can still swipe to the other tabs. Not what I wanted. Here is a diagram of what worked, but is not what I wanted (the red symbolizes the hosting fragment) вариант 1 с вложенным фрагментом хостинга внутри одной из вкладок

Второй вариант: переместите fragHost на самый верх и пусть он содержит ViewPager, чтобы он занимал весь экран. Затем в nagGraph упоминается

<navigation
    android:id="@+id/nav_graph"
    app:startDestination="@id/tab_a"
    >
    <fragment
      android:id="@+id/tab_a"
      android:name="com.myapp.home.views.TabA"
      android:layout="@layout/tab_a_layout"
      >

    <action
        android:id="@+id/action_tab_a_to_frag_a"
        app:destination="@+id/frag_a"
        />
  </fragment>

  <fragment
      android:id="@+id/frag_a"
      android:name="com.myapp.FragA"
      android:label="details"
      android:layout="@layout/frag_a"
      />

Это привело к IllegalStateException ... at androidx.fragment.app.FragmentStore.addFragment Некоторая отладка, и я увидел, что он дважды пытался добавить TabA. Я предполагал, что и ViewPagerAdapter, и компонент Nav используют диспетчер фрагментов.

Как мне получить нормальную навигацию, где вы можете использовать вкладки, но щелкнув одну из них, вы перейдете к другому полноэкранному режиму поверх вкладок?

1 Ответ

0 голосов
/ 07 августа 2020

Выяснилось, что второй вариант, о котором я упоминал, - это правильный путь к go. Пишем здесь на случай, если у кого-то такая же проблема.

Убедитесь, что ваш nav_graph указывает из содержащегося фрагмента ViewPager, а не из указанного c фрагмента, который держит ViewPager. Таким образом, не из TabA, а из ContainerFragmentA, на котором размещен ViewPager

<navigation
    android:id="@+id/nav_graph"
    app:startDestination="@id/view_pager_hosting_frag"
    >
    <fragment
      android:id="@+id/view_pager_hosting_frag"
      android:name="com.myapp.home.views.ViewPagerHostingFrag"
      android:layout="@layout/view_pager_layout"
      >

    <action
        android:id="@+id/action_tab_a_to_frag_a"
        app:destination="@+id/frag_a"
        />
  </fragment>

  <fragment
      android:id="@+id/frag_a"
      android:name="com.myapp.FragA"
      android:label="details"
      android:layout="@layout/frag_a"
      />

Затем вы можете выбрать действие, которое хотите, на любой из вкладок, чтобы go в нужное место

...