创建
首先我们选择android studio默认生成的Navigation Drawer Activity
不管是新创建一个project还是新创建Activity都是一样的生成结果
新项目不要勾选 use legacy libiraries, 除了一些老项目,使用这个会导致新功能无法使用
创建完成之后:
目录详解
自动创建的要比我们自己创建的要多出不少东西
一个一个来解释
先是mainActivity的layout
mainActivity layout中包含侧边栏和另一个layout,对应 app_bar_main ,侧边栏里又包含一个侧边栏头部对应nav_header_main
app_bar_main 里又包含 另一个layout content_main
标题栏和悬浮球也在里面
最后的content_main 里 包含我们的 导航宿主 NavHostFragment ,以一个fragment的形式存在
回到activity_main 中
侧边栏样子:
上方绿色的是头部文件,由一个图片和两个textview组成
下方是一个menu文件
位置在
你可以在该文件中添加group和item,
group的 checkableBehavior 属性为single时为单选
我们已经将 menu navcontroller绑定到了一起
而在navigation中只要我们的navigation的 fragment id和对应菜单item的id相同 ,就能在点击item时跳转到相应的fragment
在MainActivity中 我们
通过 appBarConfiguration
加载菜单的id时
是为了在该 fragment 中,依然能打开左上角侧边栏
第二种加载方式为
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration(navController.graph)
或
val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment)
val appBarConfiguration = AppBarConfiguration(navView.menu)
下图为点击效果 ,左上角依然可以点出菜单
如果删除,左上角为返回键
注: 不论何时,你都可以通过 左滑 来呼出你的侧边栏
左、右滑动通过 DrawerLayout 的 gravity属性调配
在导航宿主里
app:defaultNavHost=“true”:让 Navigation 容器处理返回事件,在 Navigation 容器中如果有页面的跳转,点击返回按钮会先处理 容器中 Fragment 页面间的返回,处理完容器中的页面,再处理 Activity 页面的返回。如果值为 false 则直接处理 Activity 页面的返回。
app:navGraph:指定 Navigation 文件。
该导航宿主不可切换成 androidx.fragment.app.FragmentContainerView
会报错
同时 如果把宿主导航的 include 排在侧边栏 NavigationView 后面,会导致点击侧边栏菜单无效果
最后跳转的方式为 navController.navigate(R.id.fragment_to_fragment)等