首页 > 解决方案 > 是否可以在主要活动中从其他片段导航 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
}

标签: androidkotlinmvvmnavigationnavigation-drawer

解决方案


不确定我是否遵循这里的逻辑和问题,但我会创建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{} 包装它并处理错误。

希望这会有所帮助,如果没有,请尝试描述应用程序失败的时间点。


推荐阅读