首发于公众号: DSGtalk1989
-
依赖,最新版本见版本号(https://mvnrepository.com/artifact/android.arch.navigation/navigation-fragment)
implementation "android.arch.navigation:navigation-fragment:1.0.0-rc02" implementation "android.arch.navigation:navigation-ui:1.0.0-rc02"
补个小知识:大家对alpha,beta,rc,release以及更多你可能看到的版本后缀的解释如下
α(Alpha)版:内测版,内部交流或者专业测试人员测试用。Bug较多,普通用户最好不要安装。
β(Beta)版:公测版,专业爱好者大规模测试用,存在一些缺陷,该版本也不适合一般用户安装。
γ(Gamma)版:相当成熟的测试版,与即将发行的正式版相差无几。
RC版:是 Release Candidate 的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
-
右键
res
下面new
一个directory
,命名为navigation
。 -
在
navigation
右键new
就会出现navigation resource file
取名为nav_demo
-
创建几个你需要做切换的
fragment
,DemoFragment1
,DemoFragment2
,DemoFragment3
,放入nav_demo
<?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"
app:startDestination="@id/page1Fragment">
<fragment
android:id="@+id/page1Fragment"
android:name="org.salamanca.kotlinframe.DemoFragment1"
android:label="fragment_page1"
tools:layout="@layout/fragment_demo1">
<action
android:id="@+id/action_page2"
app:destination="@id/page2Fragment" />
</fragment>
<fragment
android:id="@+id/page2Fragment"
android:name="org.salamanca.kotlinframe.DemoFragment2"
android:label="fragment_page2"
tools:layout="@layout/fragment_demo2">
<action
android:id="@+id/action_page1"
app:popUpTo="@id/page1Fragment" />
<action
android:id="@+id/action_page3"
app:destination="@id/page3Fragment" />
</fragment>
<fragment
android:id="@+id/page3Fragment"
android:name="org.salamanca.kotlinframe.DemoFragment2"
android:label="fragment_page3"
tools:layout="@layout/fragment_demo3">
<action
android:id="@+id/action_page2"
app:popUpTo="@id/page2Fragment" />
</fragment>
</navigation>
```
`popUpTo`表示返回到,`destination`表示去到。我们在`action`还可以添加其他的诸如
```js
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
```
等的界面切换属性。
-
在
activity
布局中加入NavHostFragment
这个导航界面容器<fragment android:id="@+id/my_nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_demo" />
defaultNavHost
表示是否拦截back
点击事件,需要配合第6步一起实现。
-
委托
back
按钮的点击事件给到导航容器,即导航容器中一旦有fragment栈切换,就会返回到上一个fragment。具体视情况而定,比如一般首页的fragment切换就不需要进行back
委托override fun onSupportNavigateUp() = findNavController(this, R.id.my_nav_host_fragment).navigateUp()
-
我们在每一个fragment中去设置跳转到哪个fragment以及如何返回
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_demo2, container, false) tvTest.setOnClickListener { Navigation.findNavController(it).navigate(R.id.action_page3) } return view }
findNavController
会通过传入的View
往上一层一层的进行遍历,直到找到NavController
为止。所以这里传入it
或者view
都可以。 -
跳转的三种方式
-
navigate
走destination
的action
,就是直接跳转界面过去 -
navigate
走popupup
的action
就是自己出栈并且跳转到相应的界面 -
navigateUp
就是直接自己出栈
-
网友评论