【问题标题】:Is it possible to navigate navhost frgamment from other fragment at main activity?是否可以在主要活动中从其他片段导航 navhost 片段?
【发布时间】:2020-10-11 18:15:21
【问题描述】:

这里我使用的是左侧导航抽屉,我使用导航图和导航控制器以及导航抽屉菜单 xml 进行了此操作。但是现在当我从左侧导航抽屉的第一项 nav_home 中单击时,我需要重新加载导航主机片段,但我不能。但是其他菜单项可以单击以转到其他片段,但是当我导航到导航主机片段时遇到问题。可能吗 ??????或者我需要改变整个过程?????

这是我导航的主要活动代码

覆盖 fun 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
}

【问题讨论】:

    标签: android kotlin mvvm navigation navigation-drawer


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 2021-12-22
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多