Компонент архитектуры навигации Android: как передать данные пакета в startDestination - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть активность с NavHostFragment.Деятельность получает определенные значения в своем намерении.Я хочу передать эти данные в первый фрагмент, т.е. startDestination графика навигации.Я не смог найти никакой документации по этому вопросу.

Я уже прошел этот вопрос по SO , но мне не удается найти метод addDefaultArguments для navController.getGraph().

Можно ли передать связку на startDestination?

Ответы [ 7 ]

0 голосов
/ 16 июля 2019

Навигация 1.0.0

        val navHostFragment = root_nav_host_fragment as NavHostFragment
        val navController = navHostFragment.navController
        val navInflater = navController.navInflater
        val graph = navInflater.inflate(R.navigation.navigation)
        val sectionId = intent.getIntExtra(KEY_SECTION_ID, -1)
        val bundle = bundleOf(KEY_SECTION_ID to sectionId)
        navHostFragment.navController.setGraph(graph, bundle)
0 голосов
/ 22 августа 2019

Отвечая на мой собственный вопрос, когда я нашел правильный подход в обновленной навигационной документации.

На момент написания этого ответа я использую Navigation 2.2.0-alpha01

Если вы хотите пройтинекоторые данные в начальный пункт назначения непосредственно в качестве аргументов от активности хоста, вам нужно вручную установить граф навигации вашего хоста внутри метода onCreate () активности хоста, как показано ниже:

Get your navController:

val navController by lazy { findNavController(R.id.<your_nav_host_id>) }

Затем в действиях хоста onCreate()

val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation.<you_nav_graph_xml>, bundle)

Или, если вы хотите передать все дополнения к цели, как это, в startDestination:

navController.setGraph(R.navigation.<you_nav_graph_xml>, intent.extras)

С момента intent.extras вернет Bundle only

Когда вы устанавливаете navGraph с помощью метода setGraph (), вам следует избегать установки атрибута app: NavGraph в определении NavHostFragment, потому что это приводит к раздутию иустановка графика навигации дважды.

При чтении этих аргументов во фрагменте startDestination:

Если вы используете Плагин Safe Args (что очень рекомендуется), затем в вашем фрагменте:

private val args by navArgs<DummyFragmentArgs>()

Плагин Safe Args генерирует класс Args, добавляя Args к имени вашего фрагмента.Например, если ваш фрагмент называется DummyFragment, тогда Safe Args сгенерирует класс с именем DummyFragmentArgs

, где navArgs<> - это функция расширения, определенная в Android KTX

Если вы не используете Android KTX, вы можете получить объект args, например:

val args = DummyFragmentArgs.fromBundle(arguments!!)

После того, как вы приобрели объект arguments, вы можете просто получить свои аргументы:

args.someArgument

Обратите внимание, как мы передали "some_argument" в качестве аргумента, и мы читаем его как someArgument, используя Safe Args

Если вы не используете Safe Args (хотя нет причин не использовать его), выможете получить доступ к своим аргументам следующим образом:

arguments?.getString("some_argument")

Все это описано в документации по Миграция на компонент навигации здесь: https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment

0 голосов
/ 17 мая 2019

вы можете добавить аргументы в свой график, как это

<fragment
  android:id="@+id/exampleFragment"
  android:label="example_fragment"
  android:name="com.example.yourapp.ui.ExampleFragment"
  tools:layout="@layout/example_fragment">
<argument
  android:name="exampleArgs"
  app:argType="reference"
  android:defaultValue="@string/example"/>
</fragment>

https://developer.android.com/guide/navigation/navigation-pass-data

0 голосов
/ 14 февраля 2019
class MainActivity : BaseActivity()  {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment = container as NavHostFragment
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(R.navigation.main_nav)

        var data : Data  = intent.getParcelableExtra("DATA") as Data
        var bundle : Bundle = Bundle()
        bundle.putParcelable("DATA", data)
        graph.addDefaultArguments(bundle)
        graph.addDefaultArguments(intent!!.extras!!)
        navHostFragment.navController.graph = graph

    }
}

Добавьте указанный выше код в Activity для отправки данных с использованием навигации

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        var data = NavHostFragment.findNavController(this).graph.defaultArguments.getParcelable("DATA") as Booking

}

Добавьте указанный выше код на стороне фрагмента

0 голосов
/ 30 декабря 2018

Я проверил исходный код и увидел, что там много изменений относительно назначения навигации и аргументов.Я думаю, что правильный способ передачи аргументов в начало назначения - это использование метода addArgument, что-то вроде этого:

val argument1 = 1 //First value
val argument2 = "Value" //Second value
val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
navController.getGraph().addArgument("Key1",navArgument1)
navController.getGraph().addArgument("Key2",navArgument2)

Возможно, есть лучший способ, но я его не нашел.

0 голосов
/ 25 декабря 2018

я также сталкивался с той же проблемой,

Вот как я решил ее:

  1. Удалите настройку xml NavHostFragment из your_activity.xml:т.е. удалить app: navGraph = "@ navigation / nav_graph

Вот как должен выглядеть ваш XML.

        <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"
        />

Добавить Настройка NavHostFragment Программно в onCreate() активности.И передайте данные пакета, используя NavGraph.addDefaultArguments(bundleData) API

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.editor_layout)
        setupNavigation()
    }

    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
    }

ОБНОВЛЕНИЕ:

Зависимости в моем файле Project Gradle:

dependencies {

    def nav_version = "1.0.0-alpha08"

    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-alpha09 по какой-то причине у Google нет метода, так как addDefaultArguments() может быть исправлено в ближайшее время.Но в более низкой версии есть метод addDefaultArguments(). Я проверил как в java, так и в kotlin, поэтому попробуйте использовать 1.0.0-alpha07 или 1.0.0-alpha08

0 голосов
/ 24 декабря 2018

Я тоже не могу найти этот метод.Он не существует в документации по компонентам архитектуры.

Но есть еще один способ установить аргументы для начального пункта назначения:

// Kotlin Code, in Fragment
with(findNavController().graph) {
    get(startDestination).addArgument(...)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...