Jetpack Navigation使用kotlin實現(xiàn)

## Jetpack-Navigation(kotlin)(一)

學(xué)習(xí)筆記巧号,案例來自于:

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

一嫩与、基本概念---該部分直接引用谷歌官網(wǎng)介紹

1.基本組成

  • 導(dǎo)航圖:在一個集中位置包含所有導(dǎo)航相關(guān)信息的 XML 資源。這包括應(yīng)用內(nèi)所有單個內(nèi)容區(qū)域(稱為目標)以及用戶可以通過應(yīng)用獲取的可能路徑饥努。
  • NavHost:顯示導(dǎo)航圖中目標的空白容器。導(dǎo)航組件包含一個默認 NavHost 實現(xiàn) (NavHostFragment)盈简,可顯示 Fragment 目標常遂。
  • NavController:在 NavHost 中管理應(yīng)用導(dǎo)航的對象。當用戶在整個應(yīng)用中移動時侥锦,NavController 會安排 NavHost 中目標內(nèi)容的交換进栽。

在應(yīng)用中導(dǎo)航時,您告訴 NavController恭垦,您想沿導(dǎo)航圖中的特定路徑導(dǎo)航至特定目標快毛,或直接導(dǎo)航至特定目標。NavController 便會在 NavHost 中顯示相應(yīng)目標番挺。

2.優(yōu)勢

  • 處理 Fragment 事務(wù)唠帝。
  • 默認情況下,正確處理往返操作玄柏。
  • 為動畫和轉(zhuǎn)換提供標準化資源襟衰。
  • 實現(xiàn)和處理深層鏈接。
  • 包括導(dǎo)航界面模式(例如抽屜式導(dǎo)航欄和底部導(dǎo)航)粪摘,用戶只需完成極少的額外工作瀑晒。
  • Safe Args - 可在目標之間導(dǎo)航和傳遞數(shù)據(jù)時提供類型安全的 Gradle 插件绍坝。
  • ViewModel 支持 - 您可以將 ViewModel 的范圍限定為導(dǎo)航圖,以在圖表的目標之間共享與界面相關(guān)的數(shù)據(jù)苔悦。
  • 使用 Android Studio 的 Navigation Editor 來查看和編輯導(dǎo)航圖轩褐。

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

3.具體使用案例

運行效果

1.新建兩個fragment

2.新建一個navigation資源文件玖详,并且打開切換至“design"視圖

新建navigation資源文件
新建navigation資源文件

4.通過可視化設(shè)置導(dǎo)航

設(shè)置navigation資源文件

navigation editor

設(shè)置activity_main:添加NavHostFragment控件把介,設(shè)置其屬性navGraph=你的navigation資源文件

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

    <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)
    }

    //設(shè)置左上角返回鍵的點擊
    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 生成的無需手動
        })
    }

}

項目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蟋座,隨后出現(xiàn)的幾起案子拗踢,更是在濱河造成了極大的恐慌,老刑警劉巖蜈七,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莫矗,居然都是意外死亡飒硅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門作谚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來三娩,“玉大人,你說我怎么就攤上這事妹懒∪讣啵” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵眨唬,是天一觀的道長会前。 經(jīng)常有香客問我,道長匾竿,這世上最難降的妖魔是什么瓦宜? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮岭妖,結(jié)果婚禮上临庇,老公的妹妹穿的比我還像新娘。我一直安慰自己昵慌,他們只是感情好假夺,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斋攀,像睡著了一般已卷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淳蔼,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天悼尾,我揣著相機與錄音柿扣,去河邊找鬼。 笑死闺魏,一個胖子當著我的面吹牛未状,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播析桥,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼司草,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泡仗?” 一聲冷哼從身側(cè)響起埋虹,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娩怎,沒想到半個月后搔课,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡截亦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年爬泥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崩瓤。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袍啡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出却桶,到底是詐尸還是另有隱情境输,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布颖系,位于F島的核電站嗅剖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘁扼。R本人自食惡果不足惜窗悯,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偷拔。 院中可真熱鬧蒋院,春花似錦、人聲如沸莲绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛤签。三九已至辞友,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背称龙。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工留拾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲫尊。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓痴柔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疫向。 傳聞我的和親對象是個殘疾皇子咳蔚,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容