如何使用安全参数将数据从导航抽屉传递到活动?
Posted
技术标签:
【中文标题】如何使用安全参数将数据从导航抽屉传递到活动?【英文标题】:How to pass data from the navigationdrawer to Activity using safe-args? 【发布时间】:2019-10-06 21:34:34 【问题描述】:假设我们有一个这样的项目:
class MainActivity : AppCompatActivity()
private lateinit var drawerLayout: DrawerLayout
private lateinit var appBarConfiguration : AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
drawerLayout = binding.drawerLayout
val navController = this.findNavController(R.id.myNavHostFragment)
NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
// prevent nav gesture if not on start destination
navController.addOnDestinationChangedListener nc: NavController, nd: NavDestination, bundle: Bundle? ->
if (nd.id == nc.graph.startDestination)
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
else
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
NavigationUI.setupWithNavController(binding.navView, navController)
一个简单项目的链接:https://github.com/udacity/andfun-kotlin-android-trivia/blob/Step.11-Solution-Adding-Animation/app/src/main/java/com/example/android/navigation/MainActivity.kt
我的 navGraph 文件包含片段和一个 Activity,如果用户从导航抽屉中选择它的标题,我想去的地方。我想向这个 Activity 发送一些数据。如何使用安全参数来做到这一点?
我正在使用:
apply plugin: "androidx.navigation.safeargs"
和
implementation 'androidx.navigation:navigation-fragment:2.0.0'
implementation 'androidx.navigation:navigation-ui:2.0.0'
【问题讨论】:
您可能需要重新考虑您的逻辑,因为使用菜单仅指定用于导航的 id 而不是操作;用于 SafeArgs。因此,要么您以普通包的形式传递数据并使用安全参数检索,要么重新考虑您的结构。 “菜单仅指定导航的 id 而不是操作” - 不正确。如果 id 引用了一个动作,那么这个动作实际上会被使用。 【参考方案1】:首先,您必须转到导航图并为活动目的地指定一个参数。这可以通过设计 UI 或像这样的 XML 来完成;
<navigation>
<activity android:id="@+id/someActivity">
<argument
android:name="isEditMode"
app:argType="boolean"
android:defaultValue="false" />
</activity>
</navigation>
这个 sn-p 假设您正在向活动传递一个布尔值。
此时,您可以构建项目,以便生成所有需要的文件。
然后在负责启动活动的任何导航菜单项的 onClick 中,传入数据;
override boolean onNavigationItemSelected(menuItem: menuItem)
val id = menuItem.itemId
when (id)
R.id.openActivity ->
val bundle = bundleOf("isEditMode" to false)
findNavController().navigate(R.id.someActivity, bundle)
return true
然后在你的activity中,安全获取pass数据为;
val safeArguments: MyActivityArgs by navArgs()
val isEditMode = safeArgs.isEditMode)
【讨论】:
我需要在不使用onNavigationItemSelected
的情况下完成它,因为它已经用图形和导航控制器完成了。最后,我以编程方式将数据添加为默认值NavArgument isDemoTrueArgument = new NavArgument.Builder().setType(NavType.BoolType).setDefaultValue(true).build(); NavGraph graph = navController.getGraph(); NavDestination demoDestination = graph.findNode(R.id.nav_demo); demoDestination.addArgument("is_demo", isDemoTrueArgument);
【参考方案2】:
在 MainActivity 的 onCreate 方法中使用:
val navController = this.findNavController(R.id.myNavHostFragment)
navController.addOnDestinationChangedListener controller, destination, arguments ->
when(destination.id)
R.id.caixaFragment ->
var myVar = someMethodThatBringsMyVarValue()
val argument = NavArgument.Builder().setDefaultValue(mayVar).build()
destination.addArgument("idMes", argument)
我从 this question 的 Ayxan Haqverdili 那里得到的
【讨论】:
以上是关于如何使用安全参数将数据从导航抽屉传递到活动?的主要内容,如果未能解决你的问题,请参考以下文章