В моем проекте Android у меня есть очень простой навигационный график, включающий два фрагмента: Master и Detail:
<navigation 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"
app:startDestination="@id/wordsListFragment">
<fragment
android:id="@+id/wordsListFragment"
android:name="com.***.presentation.view.WordsListFragment"
android:label="List"
tools:layout="@layout/words_list_fragment">
<action
android:id="@+id/action_wordsListFragment_to_wordDetailsFragment"
app:destination="@id/wordDetailsFragment" />
</fragment>
<fragment
android:id="@+id/wordDetailsFragment"
android:name="com.***.presentation.view.WordDetailsFragment"
android:label="Details"
tools:layout="@layout/word_details_fragment" />
</navigation>
Сама навигация прекрасно работает в обоих направлениях, включая поведение "Назад". В этом проекте у меня есть одно действие, где я реализую OnDestinationChangedListener
. Все это согласно следующей документации от Google: Обновление пользовательского интерфейса NavController
Я вызываю следующий метод, когда пользователь нажимает на элемент списка (находясь в главном фрагменте):
findNavController().navigate(R.id.action_wordsListFragment_to_wordDetailsFragment, null)
Тогда в родительском действии у меня есть следующая реализация:
private fun setupNavController() {
navigationController = findNavController(R.id.nav_mainhost_fragment_container)
navigationController.addOnDestinationChangedListener(mainDestinationChangedListener)
appBarConfiguration = AppBarConfiguration(navigationController.graph)
setupActionBarWithNavController(navigationController, appBarConfiguration)
}
, и это объект слушателя:
private val mainDestinationChangedListener =
NavController.OnDestinationChangedListener { controller, destination, arguments ->
if (destination.id == R.id.action_wordsListFragment_to_wordDetailsFragment) {
actionBar?.hide()
} else {
actionBar?.show()
}
}
, но destination.id
не совпадает R.id.action_wordsListFragment_to_wordDetailsFragment
Я пытался очистить проект, очистить кэш IDE, кэш градла, но сгенерированные идентификаторы все равно не совпадают. Я также пытался использовать Навигацию через Safe Args:
val action = WordsListFragmentDirections.actionWordsListFragmentToWordDetailsFragment()
findNavController().navigate(action)
, но результаты в данном слушателе всегда одинаковы (то есть не совпадают).
Некоторые значения отладки:
findNavController().navigate(1000021) //R.id.action_wordsListFragment_to_wordDetailsFragment
, но следующий вызов в стеке имеет другое значение:
, что также соответствует значениям destination.id
, переданным в OnDestinationChangedListener
:
destination.id //2131231018
Любые намеки с вашей стороны приветствуются. Я просто хочу распознать пункт назначения или идентификатор действия и соответствующим образом настроить панель инструментов.