У меня проблема при работе с несколькими NavHosts.Эта проблема очень похожа на ту, которую задали здесь .Я думаю, что решение этого вопроса также помогло бы мне, но это сообщение от 2017 года, и до сих пор нет ответа.Документация для разработчиков Android не помогает, и поиск в Интернете не показывает абсолютно ничего, что могло бы помочь.
Так что в основном у меня есть одно задание и два фрагмента.Давайте назовем их FruitsActivity, FruitListFragment, FruitDetailFragment, где FruitsActivity не имеет соответствующего кода, а его XML-макет состоит из тега <fragment>
, служащего NavHost
, например:
<fragment
android:id="@+id/fragmentContainer"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/fruits_nav_graph"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
FruitListFragment - этоstartDestination моего NavGraph, он обрабатывает список фруктов, которые придут с сервера.FruitDetailFragment показывает подробности о Fruit, выбранном в списке, отображаемом FruitListFragment.
Пока у нас есть Activity -> ListFragment -> DetailFragment.
Теперь мне нужно добавить еще один фрагмент под названием GalleryFragment,Это простой фрагмент, который отображает множество картинок выбранного фрукта и вызывается FruitDetailFragment при нажатии кнопки.
Проблема здесь в следующем: в портретном режиме я просто использую findNavController().navigate(...)
и перемещаюсь по фрагментам, как я.хочу.но когда я использую планшет в альбомном режиме, я использую этот мастер детализации для отображения списка и деталей на одном экране.Вот пример того, как это работает здесь , и я хочу, чтобы GalleryFragment заменял FruitDetailFragment, разделяя экран со списком фруктов, но пока мне удалось только заставить его заменить «основную навигацию»"Поток, занимая весь экран и отправляя FruitListFragment в Back Stack.
Я уже пытался поиграться с методом findNavController()
, но независимо от того, откуда я его вызываю, я могу получить только тот же NavController
все время, и он всегда перемещается одинаково линейно.Я пытался реализовать свой собственный NavHost, но я получаю сообщение об ошибке "файл класса для androidx.navigation.NavHost not found".
Это xml моей FruitsActivity:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragmentContainer"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/listing_nav_graph"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
</layout>
Thisэто xml FruitListActivity в ландшафтном режиме (в портретном режиме есть только RecyclerView):
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvFruits"
android:layout_weight="3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"/>
<FrameLayout
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/sideFragmentContainer"
android:name="fruits.example.FruitDetailFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
</LinearLayout>
</RelativeLayout>
</layout>
А теперь я хочу вызвать GalleryFragment и заставить его заменить только <fragment>
of id 'sideFragmentContainer'вместо целого экрана (вместо замены <fragment>
идентификатора fragmentContainer
в xml Деятельности).
Я не нашел никаких объяснений того, как обрабатывать несколько NavHosts или <fragment>
внутри <fragment>
.
Итак, на основании этого можно ли использовать навигационную архитектуру и отображать фрагмент внутри другого фрагмента?Мне нужно несколько NavHosts для этого или есть другой способ?