Navigation 的 基本使用
- 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"
}
- 創(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
- 添加 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)可以用 FragmentContainerView,查看源碼也是instantiate一個(gè)實(shí)例fragment踪危,大同小異
添加 destinations 到 navigation graph
導(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(三) 之 Room 與 ViewModel
Jetpack 之 ViewModel 原理