Kotlin Common篇之四 Navigation

作者: super_shanks | 来源:发表于2019-05-27 16:56 被阅读1次

首发于公众号: DSGtalk1989

  1. 依赖,最新版本见版本号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:正式版。

  2. 右键res下面new一个directory,命名为navigation

  3. navigation右键new就会出现navigation resource file取名为nav_demo

  4. 创建几个你需要做切换的fragmentDemoFragment1DemoFragment2DemoFragment3,放入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"
 ```
 
 等的界面切换属性。
  1. 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步一起实现。

  1. 委托back按钮的点击事件给到导航容器,即导航容器中一旦有fragment栈切换,就会返回到上一个fragment。具体视情况而定,比如一般首页的fragment切换就不需要进行back委托

    override fun onSupportNavigateUp() =
           findNavController(this, R.id.my_nav_host_fragment).navigateUp()
    
  2. 我们在每一个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都可以。

  3. 跳转的三种方式

    • navigatedestinationaction,就是直接跳转界面过去
    • navigatepopupupaction就是自己出栈并且跳转到相应的界面
    • navigateUp就是直接自己出栈

相关文章

网友评论

    本文标题:Kotlin Common篇之四 Navigation

    本文链接:https://www.haomeiwen.com/subject/qdahtctx.html