Android NavController перемещается в другое место назначения хоста - PullRequest
0 голосов
/ 11 июля 2019

У меня вопрос по поводу NavController:

Есть схема (извините за мою картину, надеюсь, она поможет: D)

enter image description here

У меня есть MainActivity и BottomNavigationView с 3 вкладками: A, B, C .

Когда я нажимаю на A, открывается Fragment A1 иnext button открывается Fragment A2.

В Fragment A2 есть кнопки back, next, здесь нет проблем с навигацией.

Проблема в том, когда мне нужнопереходить от Fragment A2 к section B так же, как щелкнуть по B в BottomNavigationView.

Проблема в том, что это другой график, как их переключать?

Мои идеи:

  1. Я нашел обходной путь: requireActivity().bottomBar.selectedItemId = R.id.graph_b, но это не очень хорошая идея.

  2. Я бы хотелчтобы достичь этого используя navigation component.Я пытался сделать findNavController().navigate(R.id.graph_b), но это приводит к сбою:

java.lang.IllegalArgumentException: навигация назначения com.my.app.staging: id / graph_b isнеизвестно этому NavController

Как это сделать с помощью NavController?

Существует проект Google Example со всей архитектурой: https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample

И чтобы упростить мой вопрос, я добавил кнопку в этом проекте, где при нажатии должен открываться другой экран:

enter image description here

1 Ответ

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

Ваши графики определены в вашей родительской активности, и именно там вы сможете их контролировать.

На самом деле ваш первый путь - это решение.Ваши графики определены в вашей деятельности.Когда вы находитесь внутри пунктов назначения внутри вашего графа A (скажем, A1, A2 и т. Д.), Они не знают о других ваших графах B & C. Единственный способ добраться до графа - через родительскую активность, и, следовательно,

requireActivity().bottomBar.selectedItemId = R.id.graph_b

Второй способ, который вы попробовали, определенно не будет работать, потому что findNavController().navigate(R.id.graph_b) используется, когда у вас есть вложенная навигация.Другими словами graph_b должно быть внутри graph_a, что не относится к вашему случаю.

Сказав, что вы можете сделать, просто напишите

requireActivity().bottomBar.selectedItemId = R.id.graph_b

любитель.Вместо того, чтобы бегать внутри своих фрагментов, лучше бегать внутри вашей деятельности.

// In your fragment
requireActivity?.moveToGraphB()

// and in your activity
fun moveToGraphB() {
    bottomBar.selectedItemId = R.id.graph_b
}

Или, если бы вы были более любопытны, вы бы использовали SharedViewModel, что я не считаю необходимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...