在 Kotlin 中,使用 Navigation Component 可以輕松實(shí)現(xiàn)應(yīng)用內(nèi)的導(dǎo)航。以下是實(shí)現(xiàn)跳轉(zhuǎn)的步驟:
在項(xiàng)目的 build.gradle 文件中添加 Navigation Component 的依賴項(xiàng):
dependencies {
def nav_version = "2.3.5" // 使用最新版本
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
}
在 res 文件夾下創(chuàng)建一個(gè)名為 navigation 的目錄,并在其中創(chuàng)建一個(gè)名為 nav_graph.xml 的文件。這個(gè)文件定義了應(yīng)用中的導(dǎo)航路由。
例如,創(chuàng)建一個(gè)簡單的 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/firstFragment">
<fragment
android:id="@+id/firstFragment"
android:name="com.example.app.FirstFragment"
tools:layout="@layout/fragment_first">
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.app.SecondFragment"
tools:layout="@layout/fragment_second">
</fragment>
</navigation>
在主 Activity(通常是 MainActivity)中,設(shè)置 Navigation Controller 并將其與導(dǎo)航圖關(guān)聯(lián)。
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupActionBarWithNavController
import androidx.navigation.ui.setupWithNavController
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return navController.navigateUp() || super.onSupportNavigateUp()
}
}
在需要實(shí)現(xiàn)跳轉(zhuǎn)的 Fragment 中,使用 Navigation UI 工具欄按鈕或代碼進(jìn)行導(dǎo)航。
例如,在 FirstFragment 中添加一個(gè)按鈕,點(diǎn)擊時(shí)跳轉(zhuǎn)到 SecondFragment:
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
class FirstFragment : Fragment() {
private lateinit var navController: NavController
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_first, container, false)
val navHostFragment =
parentFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = navHostFragment.navController
NavigationUI.setupWithNavController(view, navController)
view.findViewById<Button>(R.id.navigate_to_second_fragment)?.setOnClickListener {
navController.navigate(R.id.secondFragment)
}
return view
}
}
現(xiàn)在,當(dāng)用戶點(diǎn)擊 FirstFragment 中的按鈕時(shí),應(yīng)用將導(dǎo)航到 SecondFragment。