功能需求:
在登录成功之后,获取用户名并在上一级页面显示
解决方案:
方法1:
NavHostFragment.findNavController(this).popBackStack()
缺点:不可以携带参数
方法2:
//定义传参数据
val bundle = Bundle()
bundle.putString("uname", uname)
NavHostFragment.findNavController(this).navigate(
/**key_setting_page是将要跳转的Fragment的id
我这里使用Navgation
所以id应该是nav.xml索引id
*/
R.id.key_setting_page,
bundle
)
//此类型取参方法相信你们都会,使用bundle即可
缺点:跳转之后进入下一个fragment,再点击返回按钮会再次回到此页面,逻辑错误
方法3:
//定义传参数据
val bundle = Bundle()
bundle.putString("uname", uname)
//使用 NavBackStackEntry 的 savedStateHandle 来设置参数
val navBackStackEntry = findNavController().getBackStackEntry(R.id.key_setting_page)
navBackStackEntry.savedStateHandle.set("uname", bundle)
// 调用 navController 的 navigateUp() 方法返回到上一个 Fragment
findNavController().navigateUp()
这个实现了我的需求,使用之前需添加依赖,版本和你们的Navgation版本一致
implementation “androidx.navigation:navigation-fragment-ktx:2.5.3”
implementation “androidx.navigation:navigation-ui-ktx:2.5.3”
补充:方法3获取参数
- 添加依赖
//需要替换版本
implementation "androidx.navigation:navigation-fragment-ktx:2.5.3"
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
- 获取参数
我这里做了参数显示和按钮关闭
//获取传值username
val navBackStackEntry = findNavController().currentBackStackEntry
val savedStateHandle = navBackStackEntry?.savedStateHandle
val bundle = savedStateHandle?.get<Bundle>("uname")
//如果登录传参赋值按钮用户名
if (bundle?.getString("uname") != null) {
// 替换成你要获取的参数的键
bundle.getString("uname").also { login.text = it }
//关闭登录按钮
pLogin.isEnabled = false
}