我开始使用导航组件库并创建了一个图表来在不同片段之间导航。我的基本设置是一个带有两个片段(A 和 B)的 BottomNavigationView。片段 B 可以...
我开始使用导航组件库并创建了一个图表以在不同片段之间导航。我的基本设置是带有两个片段(A 和 B)的 BottomNavigationView。片段 B 可以深入到图表内部的片段 C,而片段 C 可以深入到片段 D。此时一切都正常,后台堆栈从 D -> C -> B。
我的问题是 Fragment Z,它可以通过活动上定义的工具栏菜单访问,并由每个 Fragment 使用。我想要的是从 A -> B -> C -> D -> Z 的路径,然后按后退按钮,我想返回到 Fragment D。但我转到了图表的开头,即 Fragment A。
Fragment Z 不使用任何操作。导航组件检测到导航图和 menu.xml 中的 fragment.id 相同,并为我进行导航。因此无法为我定义一些多返回堆栈魔法。
导航.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/nav_graph"
app:startDestination="@id/fragmentA">
<fragment android:id="@+id/fragmentA" />
<fragment android:id="@+id/fragmentZ" />
<fragment
android:id="@+id/fragmentB">
<action
android:id="@+id/action_b_to_c"
app:destination="@id/fragmentC" />
</fragment>
<fragment
android:id="@+id/fragmentC">
<action
android:id="@+id/action_c_to_d"
app:destination="@id/fragmentD" />
</fragment>
</navigation>
工具栏菜单.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/fragmentZ"
android:title="Go to Z"
app:showAsAction="always" />
</menu>
底部导航.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/fragmentA"
android:title="Go to A" />
<item
android:id="@+id/fragmentB"
android:title="Go to B" />
</group>
</menu>
主要活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView( R.layout.activity_main )
val toolbar: MaterialToolbar = findViewById(R.id.toolbar)
setSupportActionBar(toolbar)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
val navView: BottomNavigationView = findViewById( R.id.bottomNavigation )
navView.setupWithNavController( navController )
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_toolbar, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navController = findNavController(R.id.nav_host_fragment)
return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
}
}