android - 如果我点击导航控制器中的菜单,如何在两个片段目的地之间传递数据?
问题描述
我正在尝试使用导航控制器。我有一个底部导航视图。位于我的 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)
但我不知道在哪里放置该代码,如果我想将数据从我传递HomeFragment
到OderFragment
解决方案
使用时NavigationUI.setupWithNavController(bottom_navigation_view,navController)
(或者,如果您正在使用navigation-ui-ktx
Kotlin 扩展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
值。
推荐阅读
- kotlin - 如何在kotlin编程中将毫秒转换为时间戳
- excel - 导入数据格式已更改
- laravel - OrderBy 子句到 laravel 中雄辩的关系字段
- c# - 你能告诉我返回“System.Data.SqlClient.SqlException:'必须声明标量变量“@idorder”的 SqlDataReader 有什么问题吗
- mysql - 我曾尝试在 Xampp 上安装 Mifos X。它很有效,因为我可以在浏览器上访问 UI,但我的凭据有很多问题
- python - 如何在一个 tkinter 窗口中组合两个子图?
- python - 机器学习 - 如何根据过去的特征预测一组固定字段
- python - Python正则表达式在单引号内获取最长的文本
- java - JUnit 测试中的回调响应
- javascript - 自动生成输入 PUREj-s