android - 具有多个堆栈和导航组件的 DrawerLayout
问题描述
我正在使用导航组件,在我的一个片段中,我有一个带有多个堆栈的抽屉布局。
导航
Splash -> Login -> Home(drawer layout)
从家里我想使用抽屉布局和 2 个片段堆栈。
Home (Search Nav Graph) -> Search -> S1 -> S2
Home (Profile Nav Graph) -> Profile -> P1
首页片段
class HomeFragment : BaseFragment() {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val appBarConfiguration = AppBarConfiguration(setOf(R.navigation.search_nav_graph, R.navigation.profile_nav_graph), binding.drawerLayout)
binding.collapsingToolbarLayout.setupWithNavController(binding.toolbar, findNavController(), appBarConfiguration)
return binding.root
}
}
片段主页.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="@dimen/tall_toolbar_height">
<com.google.android.material.appbar.CollapsingToolbarLayout
android:id="@+id/collapsing_toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:contentScrim="?attr/colorPrimary"
app:expandedTitleGravity="top"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"/>
</com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>
<!-- The main content view where fragments are loaded -->
<FrameLayout
android:id="@+id/flContent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<!-- Container for contents of drawer - use NavigationView to make configuration easier -->
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/drawer_header" />
<include layout="@layout/drawer_menu" />
</LinearLayout>
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
我想要走的路是使用flContent
,但我没有找到根据文档匹配碎片的方法
解决方案
我终于意识到我可以使用childFragmentManager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
val busquedaNavHostFragment = NavHostFragment.create(R.navigation.search)
val perfilNavHostFragment = NavHostFragment.create(R.navigation.profile)
childFragmentManager.beginTransaction()
.add(R.id.flContent, busquedaNavHostFragment, busquedaNavHostFragment.javaClass.name)
.add(R.id.flContent, perfilNavHostFragment, perfilNavHostFragment.javaClass.name)
.hide(busquedaNavHostFragment)
.show(perfilNavHostFragment)
.commitNow()
binding.navView.findViewById<LinearLayout>(R.id.ll_perfil).setOnClickListener {
binding.drawerLayout.close()
childFragmentManager.beginTransaction()
.show(perfilNavHostFragment)
.hide(busquedaNavHostFragment)
.commit()
}
binding.navView.findViewById<LinearLayout>(R.id.ll_busqueda).setOnClickListener {
binding.drawerLayout.close()
childFragmentManager.beginTransaction()
.show(busquedaNavHostFragment)
.hide(perfilNavHostFragment)
.commit()
}
return binding.root
}
推荐阅读
- javascript - Jest 测试经常失败,因为 Puppeteer 无法点击 DOM 中的元素
- python - 如何检查列表的值是否在字典中
- php - 我无法将 php 与 ms-access db 连接
- javascript - 迭代对象直到找到与标签匹配的值
- nsfilemanager - 从 UIDocumentBrowserViewController 中的 UserDefaults 以编程方式打开文档
- reactjs - Next.js 状态更改不重新渲染 UI
- python - 使用二值化、采样和均值聚合的组合按相同键列分组
- javascript - 如何在 onPress 函数中访问 React Native 标签或元素的属性?
- django - 调用模块的模块不起作用。为什么?
- graphql - 如何基于GraphQL在nestjs中实现Auth0策略