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