在我的 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>
Run Code Online (Sandbox Code Playgroud)
导航本身在两个方向上都可以正常工作,包括“返回”行为。在那个项目中,我有一个活动,我在其中实施OnDestinationChangedListener
. 所有这些都根据谷歌的以下文档:NavController 更新 UI
当用户单击列表项时(在主片段上),我调用以下方法:
findNavController().navigate(R.id.action_wordsListFragment_to_wordDetailsFragment, null)
Run Code Online (Sandbox Code Playgroud)
然后在父活动中,我有以下实现:
private fun setupNavController() {
navigationController = findNavController(R.id.nav_mainhost_fragment_container)
navigationController.addOnDestinationChangedListener(mainDestinationChangedListener)
appBarConfiguration = AppBarConfiguration(navigationController.graph)
setupActionBarWithNavController(navigationController, appBarConfiguration)
}
Run Code Online (Sandbox Code Playgroud)
那就是侦听器对象:
private val mainDestinationChangedListener =
NavController.OnDestinationChangedListener { controller, destination, arguments ->
if (destination.id == R.id.action_wordsListFragment_to_wordDetailsFragment) {
actionBar?.hide()
} else {
actionBar?.show()
}
}
Run Code Online (Sandbox Code Playgroud)
但destination.id
不匹配R.id.action_wordsListFragment_to_wordDetailsFragment
我已经尝试清理项目,清理IDE缓存,gradle缓存,但生成的标识符仍然不匹配。我还尝试通过 …