基本上,我有一个Activity和两个Fragment。我们称它们为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是我NavGraph的startDestination,它处理从服务器获取的水果列表。FruitDetailFragment显示有关FruitListFragment中选择的水果的详细信息。
到目前为止,我们有Activity -> ListFragment -> DetailFragment。
现在我需要添加另一个名为GalleryFragment的Fragment。这是一个简单的fragment,用于显示所选水果的许多图片,并且在单击按钮时由FruitDetailFragment调用。
问题在于:在纵向模式下,我只需使用findNavController().navigate(...)
即可导航到所需的Fragment。但是当我在横向模式下使用平板电脑时,我使用主细节流在同一屏幕上显示列表和详细信息。可以在此处看到其工作示例。我希望GalleryFragment替换FruitDetailFragment,与水果列表共享屏幕,但到目前为止,我只能使它替换“主要导航”流,占据整个屏幕并将FruitListFragment发送到后堆栈。
我已经尝试在findNavController()
方法中做出更改,但无论我在哪里调用它,我都只能每次获得相同的NavController
,并且它总是以相同的线性方式进行导航。我尝试实现自己的NavHost,但出现错误“找不到androidx.navigation.NavHost的类文件”。
这是我的FruitsActivity的xml:
<?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>
这是在横向模式下FruitListActivity的XML文件(在纵向模式下只有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,并使它仅替换id为'sideFragmentContainer'的<fragment>
而不是整个屏幕(即不替换Activity xml中id为fragmentContainer
的<fragment>
)。
我没有找到如何处理多个NavHosts或<fragment>
内部有<fragment>
的任何说明。
基于此,是否可以使用导航架构在另一个片段中显示一个片段? 我需要多个NavHosts吗,还是有其他方法?