Как передать данные из навигационного окна в Activity с помощью safe-args?
Допустим, у нас есть такой проект:
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 содержит фрагменты, а также одно действие, куда я хочу перейти, если пользователь выберет его заголовок из навигационной панели. Я хочу отправить некоторые данные в это занятие. Как я могу сделать это, используя safe-args?
Я использую:
apply plugin: "androidx.navigation.safeargs"
а также
implementation 'androidx.navigation:navigation-fragment:2.0.0'
implementation 'androidx.navigation:navigation-ui:2.0.0'
0 ответов
Внутри вашего метода onCreate в MainActivity используйте это:
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)
}
}
}
Я получил это от Айхана Хаквердили в этом вопросе
Во-первых, вам нужно перейти к графу навигации и указать аргумент для назначения активности. Это можно сделать через пользовательский интерфейс дизайна или в 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)