android - 是否可以在主要活动中从其他片段导航 navhost 片段?
问题描述
在这里,我使用的是左侧导航抽屉,我使用导航图和导航控制器以及导航抽屉菜单 xml 进行了此操作。但是现在当我从左侧导航抽屉的第一项 nav_home 中单击时,我需要重新加载导航主机片段,但我不能。但是其他菜单项可以单击以转到其他片段,但是当我导航到导航主机片段时遇到问题。可能吗 ??????还是我需要改变整个过程??????
这是我导航的主要活动代码
覆盖乐趣 onNavigationItemSelected(item: MenuItem): Boolean {
if (item.itemId == R.id.nav_logout){
val intent = Intent(this, SignInActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val troyeeAppSession = TroyeeAppSession(this)
// start the new activity
startActivity(intent)
troyeeAppSession.setStatus(false)
Log.d("ClickTest","LogoutClick")
} else if (item.itemId == R.id.nav_order_list){
Log.d("ClickTest","Order List Click")
val navController = Navigation.findNavController(this!!,R.id.nav_host_fragment)
navController.navigate(R.id.nav_order_list)
drawerLayout.closeDrawer(GravityCompat.START,true)
} else if (item.itemId == R.id.nav_collection_list){
Log.d("ClickTest","Collection List Click")
val navController = Navigation.findNavController(this!!,R.id.nav_host_fragment)
navController.navigate(R.id.nav_collection_list)
drawerLayout.closeDrawer(GravityCompat.START,true)
} else if (item.itemId == R.id.nav_home){
Log.d("ClickTest","Home Button Click")
/* val navController = Navigation.findNavController(this!!,R.id.nav_host_fragment)
navController.navigate(R.id.nav_collection_list)*/
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController.navigate(R.id.nav_host_fragment)
drawerLayout.closeDrawer(GravityCompat.START,true)
}
return true
}
解决方案
不确定我是否遵循这里的逻辑和问题,但我会创建BaseActivity
abstract class BaseActivity() : AppCompatActivity() {
abstract val navController: NavController
}
然后我会用它扩展你的活动并做这样的事情:
class MainActivity : BaseActivity() {
override val navController: NavController get() = findNavController(R.id.nav_host_fragment)//You main nav controller
}
这样你就可以navController
在任何片段
中使用你的(requireActivity() as? BaseActivity)?.navController
提示:创建 BaseFragment 或扩展函数以重用代码,例如用于 Fragment。
fun Fragment.navigate(@IdRes id: Int) {
(requireActivity() as? BaseActivity)?.navController?.navigate(id)
}
或从您可以获取活动的任何其他地方。然后你的 if 语句可以变成when
when(item.itemId){
R.id.nav_logout -> {
//your code
}
R.id.nav_order_list -> {
this.navigate(R.id.nav_order_list)
drawerLayout.closeDrawer(GravityCompat.START,true)
}
}
还要记住,如果方向未知,导航将失败并出现异常,因此最好使用 try{} 包装它并处理错误。
希望这会有所帮助,如果没有,请尝试描述应用程序失败的时间点。