4

假设我们有一个像这样的项目:

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/导航/MainActivity.kt

如果用户从导航抽屉中选择其标题,我的navGraph文件 包含片段和一个我想去的活动。我想向这个 Activity 发送一些数据。如何使用安全参数来做到这一点?

我在用着:

apply plugin: "androidx.navigation.safeargs"

implementation 'androidx.navigation:navigation-fragment:2.0.0'

implementation 'androidx.navigation:navigation-ui:2.0.0'
4

2 回答 2

0

首先,您必须转到导航图并为活动目的地指定一个参数。这可以通过设计 UI 或像这样的 XML 来完成;

<navigation>
    <activity android:id="@+id/someActivity">
        <argument
            android:name="isEditMode"
            app:argType="boolean"
            android:defaultValue="false" />
    </activity>
</navigation>

此代码段假定您将布尔值传递给活动。

此时,您可以构建项目,以便生成所有需要的文件。

然后在负责启动活动的任何导航菜单项的 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
}

然后在您的活动中,安全地获取通行证数据;

val safeArguments: MyActivityArgs by navArgs()
val isEditMode = safeArgs.isEditMode)
于 2019-06-09T19:42:52.933 回答
0

在 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)
        }
    }
}

我在这个问题中从 Ayxan Haqverdili 那里得到它

于 2020-08-30T10:18:55.820 回答