Jetpack (四) 之 Navigation

原理:Jetpack Navigation 原理淺析

Navigation 的 基本使用

  1. gradle 庫導(dǎo)入 根據(jù)Java 或者 Kotlin 需求導(dǎo)入
dependencies {
  def nav_version = "2.3.2"

  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:1.0.0-alpha05"
}
  1. 創(chuàng)建 navigation graph

可以用AS界面冶匹,也可以手動(dòng)創(chuàng)建

res/navigation/nav_graph.xml

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

    <fragment
        android:id="@+id/mainPage1Fragment"
        android:name="top.zcwfeng.jetpack.navigation.MainPage1Fragment"
        android:label="fragment_main_page1"
        tools:layout="@layout/fragment_main_page1" >
        <action
            android:id="@+id/fragment1_2"
            app:destination="@id/mainPage2Fragment" />
    </fragment>
    <fragment
        android:id="@+id/mainPage2Fragment"
        android:name="top.zcwfeng.jetpack.navigation.MainPage2Fragment"
        android:label="fragment_main_page2"
        tools:layout="@layout/fragment_main_page2" >
        <action
            android:id="@+id/fragment2_3"
            app:destination="@id/mainPage3Fragment" />
    </fragment>
    <fragment
        android:id="@+id/mainPage3Fragment"
        android:name="top.zcwfeng.jetpack.navigation.MainPage3Fragment"
        android:label="fragment_main_page3"
        tools:layout="@layout/fragment_main_page3" >
        <action
            android:id="@+id/fragment3_2"
            app:destination="@id/mainPage2Fragment" />
    </fragment>
</navigation>

重點(diǎn)看下這幾個(gè)屬性

navigation ---->android:id 和 app:startDestination 聲明
fragment ------> id,name,label
fragment 子標(biāo)簽 action----> id,app:destination

  1. 添加 NavHost 到 activity

主要的NavigationActivity的activity_navigation.xml

<?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=".navigation.NavigationActivity">
    <fragment
        android:id="@+id/fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="409dp"
        android:layout_height="729dp"
        app:defaultNavHost="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

指定navigation文件
app:navGraph="@navigation/nav_graph"
主容器fragment
android:name="androidx.navigation.fragment.NavHostFragmen"
app:defaultNavHost="true" 攔截系統(tǒng)back鍵

官網(wǎng)API

新版的官網(wǎng)可以用 FragmentContainerView,查看源碼也是instantiate一個(gè)實(shí)例fragment踪危,大同小異

  1. 添加 destinations 到 navigation graph

  2. 導(dǎo)航到目標(biāo)

底部導(dǎo)航切換的做法

BottomNavigationView bottomNavigationView = findViewById(R.id.fragment1_2)...;

NavController 創(chuàng)建兩種方式

1. NavController controller=Navigation.findNavController(this,R.id.fragment_nav_host);

2.  NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_nav_host);
 NavController controller = navHostFragment.getNavController();

controller 綁定到底部導(dǎo)航View(MaterialDesign中)
NavigationUI.setupWithNavController(bottomNavigationView,controller);

回退到上一步的api

Navigation.findNavController(view).navigateUp();
或者指定目標(biāo)
Navigation.findNavController(view).navigate(R.id.action_page2);

Jetpack(一)Lifecycle和LiveData
JetPacks之Lifecycles原理
JetPack之 LifeCycle LiveData

Jetpack(二)之DataBinding

Jetpack(三) 之 Room 與 ViewModel
Jetpack 之 ViewModel 原理

Jetpack (四) 之 Navigation
Jetpack Navigation 原理淺析

JetPack (五)之 Paging 分頁庫

Jetpack(六) 之 WorkManager
Jetpack WorkManager 原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姐仅,一起剝皮案震驚了整個(gè)濱河市欣孤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖油湖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件检激,死亡現(xiàn)場離奇詭異肴捉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叔收,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門齿穗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饺律,你說我怎么就攤上這事窃页。” “怎么了复濒?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵脖卖,是天一觀的道長。 經(jīng)常有香客問我巧颈,道長畦木,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任砸泛,我火速辦了婚禮十籍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晾嘶。我一直安慰自己妓雾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布垒迂。 她就那樣靜靜地躺著械姻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上楷拳,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天绣夺,我揣著相機(jī)與錄音,去河邊找鬼欢揖。 笑死陶耍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的她混。 我是一名探鬼主播烈钞,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼坤按!你這毒婦竟也來了毯欣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤臭脓,失蹤者是張志新(化名)和其女友劉穎酗钞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體来累,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砚作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嘹锁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葫录。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兼耀,靈堂內(nèi)的尸體忽然破棺而出压昼,到底是詐尸還是另有隱情求冷,我是刑警寧澤瘤运,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站匠题,受9級(jí)特大地震影響拯坟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韭山,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一郁季、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钱磅,春花似錦梦裂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褪迟,卻和暖如春冗恨,著一層夾襖步出監(jiān)牢的瞬間答憔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國打工掀抹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐拓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓傲武,卻偏偏與公主長得像蓉驹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子揪利,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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