首页 > 解决方案 > 如果我点击导航控制器中的菜单,如何在两个片段目的地之间传递数据?

问题描述

我正在尝试使用导航控制器。我有一个底部导航视图。位于我的 MainActivity 上,它是使用下面的代码启动的:

class MainActivity : AppCompatActivity() {

    lateinit var navController : NavController
    lateinit var logoHeaderImageView : ImageView
    var toolbarMenu : Menu? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        logoHeaderImageView = findViewById(R.id.header_lakuin_image_view)

        navController = Navigation.findNavController(this,R.id.nav_main_host_fragment)



        setupBottomNavMenu(navController)
        setupActionBar(navController)



    }

    fun setupBottomNavMenu(navController: NavController) {
        NavigationUI.setupWithNavController(bottom_navigation_view,navController)
    }

    fun setupActionBar(navController: NavController) {
        setSupportActionBar(main_activity_toolbar)
        main_activity_toolbar.title = ""


        val appBarConfiguration = AppBarConfiguration(
            setOf(
                // set some destination as the top hierarchy destination, to make the up button doesn't show.
                R.id.destination_home,
                R.id.destination_order,
                R.id.destination_favourite,
                R.id.destination_cart,
                R.id.destination_profile

            ))

        NavigationUI.setupWithNavController(main_activity_toolbar,navController,appBarConfiguration)
    }


    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_main_toolbar, menu)
        toolbarMenu = menu
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
    }




}

这是我的底部导航视图的外观: 在此处输入图像描述

所以我想将数据从我的HomeFragment(目的地家)传递到OderFragment(目的地订单)。我通常使用 bundle 或 safeArgs 来传递数据,如下面的代码:

var bundle = bundleOf("amount" to amount)
view.findNavController().navigate(R.id.confirmationAction, bundle)

但我不知道在哪里放置该代码,如果我想将数据从我传递HomeFragmentOderFragment

标签: androidandroid-architecture-componentsandroid-navigationandroid-jetpackandroid-architecture-navigation

解决方案


使用时NavigationUI.setupWithNavController(bottom_navigation_view,navController)(或者,如果您正在使用navigation-ui-ktxKotlin 扩展bottom_navigation_view.setupWithNavController(navController)),您不能将任何自定义参数传递给目的地 - 全局导航的一个重要部分是它们总是以相同的状态将您带到同一个屏幕。

通常,您应该将当前数量的数据与 Navigation 参数分开保存——无论是在持久化数据库、SharedPreferences 还是其他可以在进程死亡后幸存的位置,从而允许用户在重新启动后继续他们正在做的事情。电话等

但是,如果您必须为此使用导航参数,您可以提前为您的目的地设置默认参数(即,每当您的金额发生变化时):

NavDestination orderDestination = navController.graph.findNode(R.id.destination_order)
orderDestination.addArgument("amount", NavArgument.Builder()
    .setType(NavType.FloatType)
    .setDefaultValue(amount)
    .build())

之后,默认情况下,您的BottomNavigationView触发R.id.destination_order将自动包含该参数以及您的新amount值。


推荐阅读