我在处理多个 NavHost 时遇到问题。这个问题与这里提出的问题非常相似。我认为这个问题的解决方案也会对我有所帮助,但这是 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 是我的 NavGraph 的 startDestination,它处理来自服务器的水果列表。FruitDetailFragment 显示 FruitListFragment 显示的列表中所选水果的详细信息。
到目前为止,我们有 Activity -> ListFragment -> DetailFragment。
现在我需要再添加一个 Fragment,称为 GalleryFragment。它是一个简单的片段,显示许多所选水果的图片,并在单击按钮时由 FruitDetailFragment 调用。
这里的问题是:在纵向模式下,我只是使用findNavController().navigate(...)
并按照我想要的方式浏览片段。但是当我在横向模式下使用平板电脑时,我正在使用该主详细信息流在同一屏幕上显示列表和详细信息。这里有一个如何工作的示例,我希望 GalleryFragment 替换 FruitDetailFragment,与水果列表共享屏幕,但到目前为止我只能设法使其替换“主导航”流,占据整个屏幕并将 FruitListFragment 发送到 Back Stack。
我已经尝试过使用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 并让它只替换<fragment>
id 'sideFragmentContainer' 而不是整个屏幕(而不是替换Activity 的 xml 中<fragment>
的 id fragmentContainer
)。
我没有找到任何关于如何处理多个 NavHosts 或<fragment>
inside的解释<fragment>
。
那么基于此,是否可以使用导航架构并在另一个片段中显示一个片段?我需要多个 NavHost,还是有其他方法?