Android Jetpack架构组件 Navigation 导航库


做什么的?

用于用户导航、进入或者退出应用中不同内容片段的交互。通过 Jetpack导航组件可帮助你实现导航,无论是简单的按钮点击,还是应用栏或抽屉式导航栏等复杂的模式,这个组件都可以应对。(简化了导航的实现)

将业务和视图分离。

优势

  • 方便管理Fragment页面。
  • 可视化页面导航,类似于xcode中的StoryBoard,便于看清页面之间的关系
  • 通过destination和action来完成页面间的导航
  • 方便页面切换动画
  • 页面间内饰内饰的参数传递
  • 通过NavigationUI类,对菜单,底部导航,抽屉菜单导航进行方便统一的管理
  • 深层连接

本文中的”页面“指的是Fragment和Activity,但主要是Fragment,因为Navigation组件的主要目的就是方便我们在一个Activity中对多个Fragment进行管理。

基本使用

依赖
dependencies {
    implementation "androidx.navigation:navigation-fragment-ktx:2.3.0"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.0"
}

更多版本

创建 Navigation Graph

ok 创建完成

创建nav_graph文件

添加 NavHostFragment

添加到Activity布局文件中,作为其他Fragment的容器

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="411dp"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <fragment
        android:id="@+id/frameLayout"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/toolbar"
        app:navGraph="@navigation/nav_graph">

    </fragment>

</androidx.constraintlayout.widget.ConstraintLayout>
android:name="androidx.navigation.fragment.NavHostFragment"

告诉系统这是一个特殊的Fragment

app:defaultNavHost="true"

点击返回按钮是,系统会自动将Fragment退出。

 app:navGraph="@navigation/nav_graph"

对应的Fargment导航图

设置导航(Navigation)

创建MainFragment和SecondeFragment

destination 表示目的地,既你想要去的地方。Navigation 组件的目的就是方便开发者在一个Activity中管理多个Fragment。所以在这里创建一个MainFragment。

选择 Fragment

表示首个加载的Fragment

选择 code

app:startDestination = “@id/mainFragment”

表示首个加载的Fragment

设置MainFragment界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context=".MainFragment">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="18sp"
        android:text="MainFragment"/>

    <Button
        android:id="@+id/btnToSecondFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tvTitle"
        android:textAllCaps="false"
        android:text="to SecondFragment"/>

</RelativeLayout>

设置跳转顺序

ps:sscondFragment为secondFragment

选中mainFragment后点击方块连线到secondFragment

可以看到 标签中,app:destination 属性表示目的地,这里表示的是secondFragment

<?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.thecara.navigation.MainFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_sscondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.thecara.navigation.SscondFragment"
        android:label="fragment_sscond"
        tools:layout="@layout/fragment_sscond" />
</navigation>
设置跳转

使用这个来跳转

        view.findViewById<Button>(R.id.btnToSecondFragment).setOnClickListener {
            Navigation.findNavController(view).navigate(R.id.action_mainFragment_to_sscondFragment)
        }

Navigation.findNavController(params).navigate(id)

表示通过指定id跳转的哪里,这里指跳转到 secondeFragment。

其中还有

Navigation.findNavController(params).navigateUp()

负责向上跳转

演示

关系

  • Navigation Graph

这是一种新型的 XML 资源文件,里面包含了应用程序所有的页面及页面之间的关系

  • NavHostFragment

这是一个特殊的布局文件,NavigationGraph中的页面通过该Fragment展示

  • NavController

用于在代码中完成NavigationGraph中的具体页面切换

所以,当你使用NavController对象,告诉它你想要去NavigationGraph中的那个页面,NavController将会将相关的页面展示在NavHostFragment中。

引用:

导航

Navigation(一)基础入门


文章作者: TheCara
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 TheCara !
 上一篇
Android控件 Android控件
SeekBar(拖动条)它是 ProgressBar的子类,这样ProgressBar的属性它都可以用!同时它还有自己的属性 android:thumb,允许我们自定义滑块。
2020-11-29
下一篇 
ExoPlayer2 Google依赖库 ExoPlayer2 Google依赖库
概述ExoPlayer构建在Android低水平媒体API之上的一个应用层媒体播放器。支持内置播放器的所有格式外加自适应格式DASH和SmoothStreaming。所有它可以高度定制和扩展。 使用1.添加依赖 在项目的根目录下 打开 bu
2020-11-13
  目录