咱们了解了Navigation以后,就不得不提Navigation Editor。咱们能够经过Android Studio的 Navigation Editor去编辑和浏览咱们的Navigation graph(导航图)android
请注意这里必需要求咱们的的Android Studio版本在3.3或者以上版本git
目前也有不少文章介绍Navigation以及Navigation Editor可是更多的是介绍Android Studio3.3以前版本的,本篇文章着重介绍的是Android Studio3.3及以上版本,有不少不一样之处。如需应用如下内容请先升级Android Studio至3.3或者以上版本。github
在Module下面的build.gradle当中bash
dependencies {
def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin
}
复制代码
导航是发生在应用的目标示图之间——用户能够导航到应用当中的任何的位置。将这些目标视图经过操做来链接起来。
导航图是包括全部的目标视图和操做的一个资源文件,这个导航图标表明了咱们应用的全部的导航路径图。app
若是咱们是第一次建立导航图,Android Studio会在res文件夹下面建立一个navigation 的资源文件目录,这个目录当中就包含了咱们刚才建立的资源文件。如图:编辑器
点击打开刚才建立的Navigation的xml文件,而后选择Design。 咱们能够看到Navigation Editor控制面板自左向右有三部分如图: ide
点击Text咱们能够看到XML文件gradle
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph">
</navigation>
复制代码
这里的</navigation>
是导航图的根元素,当咱们要在图标当中添加目标视图和链接动做的时候,咱们可使用<destination>
和<action>
元素做为子元素。动画
一个主导航必须由NavHost派生而来,导航组件默认经过NavHost来实现,NavHostFragment来处理目标fragment直接的切换。ui
在咱们应用程序的main activity当中添加NavHostFragment 这里的添加有两种方式 1.复制下面代码到xml的代码文件当中
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true"
/>
复制代码
2.在design下面控制面板选择 位置如图:
而后咱们直接拖NavHostFragment 的视图到咱们的activity文件当中
这里总共有三种不一样的方式能够在咱们的导航视图当中添加目标视图
若是咱们想把已经存在的目标视图想要添加在导航图当中,咱们只须要点击New Destination而后找到已经存在目标视图,选择便可。
如图:
目标视图咱们已经建立完成了,接下来咱们就开始链接各个目标视图了。固然,咱们链接目标视图就是经过Navigation Editor来完成。
<?xml version="1.0" encoding="utf-8"?>
<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" android:id="@+id/nav_graph"
app:startDestination="@id/oneFragment">
<fragment android:id="@+id/oneFragment" android:name="demo.rlv.cehome.com.navigationcomponents.OneFragment"
android:label="fragment_one" tools:layout="@layout/fragment_one">
<action android:id="@+id/action_oneFragment_to_twoFragment" app:destination="@id/twoFragment"/>
</fragment>
<fragment android:id="@+id/twoFragment" android:name="demo.rlv.cehome.com.navigationcomponents.TwoFragment"
android:label="fragment_two" tools:layout="@layout/fragment_two"/>
</navigation>
复制代码
导航到目标视图,咱们须要用到NavController,它是用于管理NavHost中的应用程序导航的对象。 每一个NavHost都有本身的相应NavController。
NavController有如下几种获取方式:
对于Java来讲:
对于Kotlin来讲:
下面咱们就看一下在咱们要实现的效果:
下面咱们看一下实现代码,在OneFragment当中
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
view?.findViewById<Button>(R.id.button_one)?.setOnClickListener {
view?.let { Navigation.findNavController(it).navigate(R.id.twoFragment)
}
}
}
复制代码
只须要添加就能够实现跳转功能,是否是很方便?
Navigation.findNavController(it).navigate(R.id.twoFragment)
复制代码
对于Button控件来讲,还有另外一种实现跳转的方法
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
// view?.findViewById<Button>(R.id.button_one)?.setOnClickListener {
// view?.let { Navigation.findNavController(it).navigate(R.id.twoFragment)
// }
// }
button_one.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.twoFragment, null))
}
复制代码
两种跳转分别是传入nav_graph.xml当中的action id和resource id。 两种方法均可以实现跳转,可是我更建议用第一种,由于第一种能够配合着过渡的动画使用。
咱们常见的一种逻辑以下: 有三个目标视图分别是A、B、C,有A到B,B到C,而后C到A。
能够看到当咱们倒C以后,后台堆栈当中包括A、B、C单个实例。当咱们经过popUpTo A
回到A的时候,意味着咱们从堆栈当中把B和C删除了。当咱们使用app:popUpToInclusive =“true”
的时候,咱们还会把A弹出堆栈并有效的清除它。若是咱们没有使用app:popUpToInclusive =“true”
那么也意味着咱们的堆栈当中包含两个A的实例。 实现代码以下:
<action
android:id="@+id/action_c_to_a"
app:destination="@id/a"
app:popUpTo="@+id/a"
app:popUpToInclusive="true"/>
复制代码
当我尝试写这篇文章,并认真看过了官方文档,本身也实践以后发现Navigation以及Navigation Editor真的很是实用!在代码当中,咱们不用写不少的Activity。写一个Activity嵌套多个Fragment就能够完成,固然这也是谷歌一直推崇的一种方式。那么不一样的Fragment之间的跳转,可能就是摆在咱们面前的一大难题,常常会有这样会那样的问题,同时逻辑不是很清晰而且须要大量的代码用来实现。可是有了Navigation和Navigation Editor以后就有效的解决了这一问题!