美文网首页androidAPP & program
Android-Jetpack-Navigation组件使用

Android-Jetpack-Navigation组件使用

作者: 阿博聊编程 | 来源:发表于2022-04-14 14:41 被阅读0次
    图片来源网络

    可能有部分Android开发的小伙伴见过单Activity多FragmentApp,使用起来非常的流畅或者说非常的丝滑。自己想要尝试这种开发模式的时候,又会发现Fragment的管理会比较麻烦。现在不用怕了,Android SDK为了我们提供了Navigation来实现这种开发模式。希望这篇文章对小伙伴们有所启发。

    Navigation的优势

    先来说说使用Navigation的优势:

    • 可以可视化页面的导航,可以帮我们快速理清页面之间的关系;
    • 通过destinationaction完成页面之间的导航;
    • 方便我们添加页面的切换动画;
    • 页面之间类型安全的参数传递;
    • 通过NavigationUI类,对菜单、底部导航、抽屉菜单导航进行统一的管理;
    • 支持深层链接DeepLink(深层链接)。

    project的Navigation依赖设置

    dependencies {
       def nav_version = "2.4.2"
       classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
    

    module的Navigation依赖设置

    plugins {
      id 'androidx.navigation.safeargs'
    }
    

    Java版本:

    implementation "androidx.navigation:navigation-fragment:2.4.1"
    implementation "androidx.navigation:navigation-ui:2.4.1"
    

    Kotlin版本:

    implementation "androidx.navigation:navigation-fragment-ktx:2.4.1"
    implementation "androidx.navigation:navigation-ui-ktx:2.4.1"
    

    Compose版本:

    implementation "androidx.navigation:navigation-compose:2.4.1"
    

    Navigation的主要因素

    • Navigation Graph,新型的XML资源文件,其中包含App所有的页面,以及页面之间的关系。
    • NavHostFragment,特殊的Fragment,我们可以认为是一个Fragment的容器,Navigation Graph中的Fragment都是通过NavHostFragment进行展示。
    • NavController,在代码当中完成Navigation Graph中的页面切换工作。

    Navigation代码示例

    1.在res创建navigation资源文件夹,在navigation创建nav_graph.xml文件。

    2.在activity_main.xml,内容详情如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <fragment
            android:id="@+id/nav_host_fragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/nav_graph"
            app:defaultNavHost="true"/>
    </LinearLayout>
    

    属性说明如下:

    • android:name="androidx.navigation.fragment.NavHostFragment",告诉系统这是一个特殊的Fragment
    • app:defaultNavHost="true",表示Fragment会自动处理系统返回键,当用户做返回操作的时候会退出当前的Fragment.
    • app:navGraph="@navigation/nav_graph",导航视图。

    3.在nav_graph.xml创建两个Fragment

    <?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/mainFragment">
    
        <fragment
            android:id="@+id/mainFragment"
            android:name="com.yb.test.MainFragment"
            android:label="fragment_main"
            tools:layout="@layout/fragment_main">
            <action
                android:id="@+id/action_mainFragment_to_secondFragment"
                app:destination="@id/secondFragment" />
        </fragment>
    
        <fragment
            android:id="@+id/secondFragment"
            android:name="com.yb.test.SecondFragment"
            android:label="fragment_second"
            tools:layout="@layout/fragment_second" />
    </navigation>
    

    4.NavControIIer实现导航功能

    我们在MainFragment中创建按钮,设置按钮的点击事件:

    view.findViewById<Button>(R.id.btn).setOnClickListener {
       Navigation.findNavController(it).navigate(R.id.action_mainFragment_to_secondFragment)
    }
    

    大概的实现就是这样子,感兴趣的小伙伴可以尝试一下。

    相关文章

      网友评论

        本文标题:Android-Jetpack-Navigation组件使用

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