Google 2018 I/O大会上,谷歌隆重推出一个新的架构组件:Navigation。从名字上可以看出他是一个导航,其实我们可以把它理解为FragmentNavigation。它提供了多Fragment之间的转场,栈管理,帮助你更轻松的使用Fragment。在以后抽屉式导航栏,底部、顶部导航栏的需求中我们可以尝试使用这个新组件。甚至,你可以尝试写一个单Activity的应用。
使用Navigation需要AndroidStudio的版本3.2以上
在Module下的build.gradle中添加以下依赖:
dependencies {
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha04"
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0-alpha04"
}
然后新建一个Activity,需要用到 NavHost 来托管 Navigation,NavHost 是个接口,默认是用 NavHostFragment 来托管,NavHostFragment 是实现了 NavHost 接口的,查看 NavHostFragment 会看到,在注释里他已经提供了简单的activity布局写法。NavigationMainActivity布局:
接着新建两个Fragment和一个Activity
然后res目录右键选择new -> Android Resource File
这个时候在res目录下会产生navigation文件夹并生成一个nav_graden文件
在这个文件下,我们将Fragment关联进去,
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@+id/menu1_fragment"
android:id="@+id/nav_garden">
<fragment android:id="@+id/menu1_fragment"
android:name="com.test.navigation.Menu1Fragment"
android:label="@string/menu1_title"
tools:layout="@layout/fragment_menu1"
/>
<fragment
....framgent2
/>
</navigation>
这里面的name是fragment的类名;tools:layout就是关联fragment的layout文件。
navigation必须要设置 app:startDestination,这是给导航指定起始位置的,不然会奔溃报错。
结合ToolBar和navigationView
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--id 对应navigation的id-->
<item android:id="@id/menu1_fragment" android:title="@string/menu1_title"/>
<item android:id="@id/menu2_fragment" android:title="@string/menu2_title"/>
</menu>
这样NavigationView 的app:menu="@menu/menu_navigation"也创建好了。注意menu这里的id需要和navigation的id对应
activity代码修改为:
Navigation 可以和 Toolbar 相结合,Toolbar 左边会出现个返回的箭头,这样箭头的显示和隐藏控制都不用我们去写了。 用 Toolbar 的话 Activity 的 style 要设置 NoActionBar 的
这里用到了 NavigationUI 的setupActionBarWithNavController(AppCompatActivity activity, NavController navController) 方法,还覆盖了 onSupportNavigateUp() 方法。是因为在宿主activity里需要重写onSupportNavigateUp方法去启动fragment