jetpack navigation使用案例kotlin实现

学习笔记,案例来自于:

https://www.bilibili.com/video/BV1w4411t7UQ/?p=17

一、基本概念—该部分直接引用谷歌官网介绍

1.基本组成

  • 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为目标)以及用户可以通过应用获取的可能路径。
  • NavHost:显示导航图中目标的空白容器。导航组件包含一个默认 NavHost 实现 (NavHostFragment),可显示 Fragment 目标。
  • NavController:在 NavHost 中管理应用导航的对象。当用户在整个应用中移动时,NavController 会安排 NavHost 中目标内容的交换。

在应用中导航时,您告诉 NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController 便会在 NavHost 中显示相应目标。

2.优势

  • 处理 Fragment 事务。
  • 默认情况下,正确处理往返操作。
  • 为动画和转换提供标准化资源。
  • 实现和处理深层链接。
  • 包括导航界面模式(例如抽屉式导航栏和底部导航),用户只需完成极少的额外工作。
  • Safe Args - 可在目标之间导航和传递数据时提供类型安全的 Gradle 插件。
  • ViewModel 支持 - 您可以将 ViewModel 的范围限定为导航图,以在图表的目标之间共享与界面相关的数据。
  • 使用 Android Studio 的 Navigation Editor 来查看和编辑导航图。

注意:需要 Android Studio 3.3 或更高版本。

3.具体使用案例

jetpack navigation使用案例kotlin实现_第1张图片

1.新建两个fragment

2.新建一个navigation资源文件,并且打开切换至“design"视图

jetpack navigation使用案例kotlin实现_第2张图片
jetpack navigation使用案例kotlin实现_第3张图片

4.通过可视化设置导航

设置navigation资源文件
jetpack navigation使用案例kotlin实现_第4张图片
设置activity_main:添加NavHostFragment控件,设置其属性navGraph=你的navigation资源文件


<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">

    <fragment
        android:id="@+id/fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/navigation_main" />
androidx.constraintlayout.widget.ConstraintLayout>

5.代码编写

MainActivity

package com.example.navigationdemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.NavController
import androidx.navigation.Navigation
import androidx.navigation.ui.NavigationUI

class MainActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //注意:该布局文件id---是NavHostFragment的id
        val navController:NavController=Navigation.findNavController(this,R.id.fragment)
        //显示左上角返回键
        NavigationUI.setupActionBarWithNavController(this,navController)
    }

    //设置左上角返回键的点击
    override fun onSupportNavigateUp(): Boolean {
        return Navigation.findNavController(this,R.id.fragment)
            .navigateUp()

    }
}

DetailFragment

package com.example.navigationdemo

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.Navigation
import kotlinx.android.synthetic.main.fragment_detail.*

/**
 * A simple [Fragment] subclass.
 * Use the [DetailFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class DetailFragment : Fragment() {


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_detail, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        //按键点击事件
        button2.setOnClickListener(View.OnClickListener {
            Navigation.findNavController(it)
                .navigate(R.id.action_detailFragment_to_homeFragment)   //该id是Android studio 生成的无需手动
        })
    }

}

项目

你可能感兴趣的:(jetpack,android)