Как передать данные из навигационного окна в Activity с помощью safe-args? - PullRequest
1 голос
/ 20 мая 2019

Скажем, у нас есть такой проект:

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'

1 Ответ

0 голосов
/ 09 июня 2019

Во-первых, вам нужно перейти к графику навигации и указать аргумент для места назначения активности.Это можно сделать с помощью пользовательского интерфейса разработки или в 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)
...