Navigation
是Jetpack中的页面转换元件。
用来取代FragmentTransaction
,
以GUI方式呈现页面流程,
能更方便的管理各Fragment
之间的跳转关系。
如图:
假设A Fragment
跳转到B Fragment
Gradle
新增dependencies
navigation.xml
Activity
的xml
中,新增一个<FragmentContainerView/>
元件,navigation.xml
。A Fragment
找到内部已透过2绑定对应的NavController
,执行页面跳转。接着就来实做看看吧
Gradle
新增dependencies
project层的build.gradle
dependencies {
val nav_version = "2.3.5"
classpath
"androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// 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:2.4.0-alpha08")
}
module层的build.gradle
apply plugin: "androidx.navigation.safeargs.kotlin"
navigation.xml
在res
按下右键,新增Android resource file
。
Resource Type
选择Navigation
。
在xml
中新增对应的fragment
:
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
app:startDestination="@id/aFragment"
android:id="@+id/nav_graph">
<fragment
android:id="@+id/aFragment"
android:name="com.example.cashdog.cashdog.AFragment"
android:label="@string/label_blank"
tools:layout="@layout/fragment_blank" >
<action
android:id="@+id/action_aFragment_to_bFragment"
app:destination="@id/bFragment" />
</fragment>
<fragment
android:id="@+id/bFragment"
android:name="com.example.cashdog.cashdog.BFragment"
android:label="@string/label_blank_2"
tools:layout="@layout/fragment_blank_fragment2" />
</navigation>
<action>
的作用为A Fragment
跳转至B Fragment
。
A Fragment
和B Fragment
的Activity
底下,新增一个<FragmentContainerView/>
元件,并绑定navigation.xml
。<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
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.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</FrameLayout>
android:name="androidx.navigation.fragment.NavHostFragment"
用来宣告实现此 Fragment
为 NavHostFragment
app:defaultNavHost="true"
true
会拦截返回按键,让页面返回上一层,
不会退出Activity
。
上一层可以是Fragment
或Activity
。
app:navGraph="@navigation/nav_graph"
作用是将activity_main.xml
中的Fragment
与navigation
连接起来。
A Fragment
找到内部已透过2绑定对应的NavController
,执行页面跳转。NavController
的方法如下:
- Activity.findNavController(viewId: Int)
- Fragment.findNavController()
- View.findNavController()
写法:
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
navController
为fragment
的navigation
。
假设透过按下AFragment
中的某个按钮跳转到BFragment
:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
val action = AFragmentDirections.actionAFragmentToBFragment()
view.findNavController().navigate(action)
}
}
就会切换到下一页了。
参考:
<<: DAY9 样式属性权重 - Nav Bar实作之遇到的小卡顿
>>: Day 9 Compose UI AndroidView
按下Return键移动到下一个textfield栏位 步骤: 使用textfield的tag 使用U...
以物件做props的传递 我们先来看看一个例子! 在这里我们先用props把外层元件的data里的i...
用Python处理Excel Python可以使用openpyxl自动化处理excel的编辑、建立、...
前一篇我们提到了一部分的启动流程,今天我们会探讨剩下的启动流程资讯。 首先,我们要先知道 JavaS...
本文将於赛後同步刊登於笔者部落格 有兴趣学习更多 Kubernetes/DevOps/Linux 相...