一、初步使用
1、首先将navigation的库导入到项目中,最新库请看google文档。
// 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:$nav_version"
添加到如下图位置,并同步项目生效。
2、创建登陆页面、忘记密码页面、注册页面。这些需要被操作的Fragment和布局。例如下面代码:
class LoginFragment : Fragment() {
var _binding:FragmentLoginBinding?=null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return FragmentLoginBinding.inflate(inflater).also {
_binding=it
}.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment.LoginFragment">
<TextView
android:id="@+id/tv_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这里是登录页面"
android:textSize="20sp" />
<Button
android:id="@+id/btn_goto_forget_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="忘记密码"
android:textSize="20sp" />
<Button
android:id="@+id/btn_goto_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="注册账号"
android:textSize="20sp" />
</LinearLayout>
3、在res文件夹下面,添加navigation管理资源文件。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_config"
app:startDestination="@id/fragment_login"> <!--设置在Fragment容器内默认展示的fragment-->
<fragment
android:id="@+id/fragment_login"
android:name="com.github.navigationdemo.fragment.LoginFragment"> <!--设置fragment的ID,和fragment的路径。-->
<action
android:id="@+id/goto_forget"
app:destination="@id/fragment_forget" /> <!--设置fragment跳转动作的id,和跳转页面的id。-->
<action
android:id="@+id/goto_register"
app:destination="@id/fragment_register" />
</fragment>
<fragment
android:id="@+id/fragment_forget"
android:name="com.github.navigationdemo.fragment.ForgetPwdFragment">
</fragment>
<fragment
android:id="@+id/fragment_register"
android:name="com.github.navigationdemo.fragment.RegisterFragment">
</fragment>
</navigation>
4、在主页面添加Fragment的展示容器,并配置导航使用的管理类。
<?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=".NavigationMainActivity">
<androidx.fragment.app.FragmentContainerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/navigation_container"
android:name="androidx.navigation.fragment.NavHostFragment" 设置导航实现类,此处使用系统实现好的NavHostFragment
app:navGraph="@navigation/nav_config" 设置导航的资源图
app:defaultNavHost="true"
/>
</FrameLayout>
5、因为在MainActivity的页面里面,配置了FragmentContinner,并配置了导航实现类和导航资源图,并且在导航资源里面,已经设置了默认展示的页面是LoginFragment,所以现在默认展示的页面就是LoginFragment。修改LoginFragment代码。
package com.github.navigationdemo.fragment
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.github.navigationdemo.R
import com.github.navigationdemo.databinding.FragmentLoginBinding
class LoginFragment : Fragment() {
var _binding:FragmentLoginBinding?=null
val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return FragmentLoginBinding.inflate(inflater).also {
_binding=it
}.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnGotoForgetPwd.setOnClickListener{
//获取导航控制器,并通过注册的nav_config资源,根据ActionID,进行跳转页面
findNavController().navigate(R.id.goto_forget)
}
binding.btnGotoRegister.setOnClickListener{
findNavController().navigate(R.id.goto_register)
}
}
}
总结:
主要跳转方法就是
findNavController().navigate(ActionId)
资源文件中注册ActionId:
<fragment android:id="@+id/fragment_login" android:name="com.github.navigationdemo.fragment.LoginFragment"> <action android:id="@+id/goto_forget" app:destination="@id/fragment_forget" /> </fragment>
可以下载我的demo项目,了解细节内容。项目传送门