Почему addDefaultArguments() удален из компонента навигации версии 1.0.0-alpha09? Что такое WorkAround для передачи аргумента в StartDestination из Activity?
Здравствуйте, я работаю над компонентом архитектуры навигации и я и настраиваю NavHostFragment для моей деятельности программно.
MainActivity.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/nav_host"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
/>
</android.support.constraint.ConstraintLayout>
MainActiviy.kt:
package com.andor.navigate.demonavigation
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import androidx.navigation.Navigation
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.NavigationUI
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupNavigation()
NavigationUI.setupActionBarWithNavController(this, NavHostFragment.findNavController(nav_host))
}
override fun onSupportNavigateUp(): Boolean = Navigation.findNavController(
this,
R.id.nav_host
).navigateUp()
private fun setupNavigation() {
val navHostFragment = nav_host as NavHostFragment
val navController = navHostFragment.navController
val navInflater = navController.navInflater
val graph = navInflater.inflate(R.navigation.nav_graph)
graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
navHostFragment.navController.graph = graph
}
}
Проблема:
Я использую приведенный выше код в течение длительного времени, но я обновил свою версию зависимости gradle android.arch.navigation:navigation
от 1.0.0-alpha08
в 1.0.0-alpha09
и после обновления в строке кода ниже я получаю ошибку времени компиляции:
код:
graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination
ошибка:
Неразрешенная ссылка: addDefaultArguments
зависимость (файл проекта):
dependencies {
def nav_version = "1.0.0-alpha09"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin}
}
Когда я вернусь к версии навигации 1.0.0-alpha08
все работает нормально. По какой-то причине Google удалил addDefaultArguments из NavDestination в версии alpha09.
У кого-нибудь есть идея, почему метод addDefaultArguments удален?
ОБНОВИТЬ:
Что такое WorkAround для передачи аргумента в StartDestination из Activity?
Проверьте ветку для получения более подробной информации по этому вопросу. В основном, я хочу найти способ отправить Аргументы на мой startDestination из моей Деятельности, в которой находится Фрагмент навигации.
До 1.0.0-alpha09:
Единственное решение, которое я могу найти, использует addDefaultArguments()
после 1.0.0-alpha09
без понятия???
Если есть какие-либо решения этой проблемы, поделитесь!
1 ответ
Я проверил исходный код и увидел, что есть много изменений в отношении назначения навигации и аргументов. Я думаю, что правильный способ передачи аргументов по умолчанию в граф навигации выглядит примерно так:
val navHostFragment = nav_host as NavHostFragment
val navController = navHostFragment.navController
val navInflater = navController.navInflater
val graph = navInflater.inflate(R.navigation.nav_graph)
if(intent.extras!=null) {
val argument1 = intent.extras.get("Key1")
val argument2 = intent.extras.get("Key1")
val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
graph.addArgument("Key1",navArgument1)
graph.addArgument("Key2",navArgument2)
}
navHostFragment.navController.graph = graph
Может быть, есть лучший способ, но я его не нашел.