android - 导航视图全局操作返回状态
问题描述
我一直在搞乱 Jetpack 导航组件,我创建了一个使用导航抽屉的活动。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navigationController = findNavController(R.id.navigationHostFragment)
navigationView.setupWithNavController(navigationController)
val appBarConfiguration = AppBarConfiguration(TOP_LEVEL_DESTINATIONS, drawerLayout)
toolbar.setupWithNavController(navigationController, appBarConfiguration)
}
override fun onSupportNavigateUp(): Boolean =
NavigationUI.navigateUp(findNavController(R.id.navigationHostFragment), drawerLayout)
}
这如我所料,但后来我为设置屏幕添加了一个全局操作。
<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"
android:id="@+id/main"
app:startDestination="@id/appBarFragment">
...
<activity android:id="@+id/settingsActivity"
android:name="com.example.app.ui.SettingsActivity"
android:label="@string/title_settings"/>
<action android:id="@+id/settingsAction"
app:destination="@+id/settingsActivity"/>
</navigation>
并参考NavigationView
菜单中的操作。
<menu xmlns:android="http://schemas.android.com/apk/res/android">
...
<group android:id="@+id/navigationGroupSettings">
<item android:id="@+id/aboutAction"
android:title="@string/title_about"
android:icon="@drawable/ic_info_black_24dp"/>
<item android:id="@+id/settingsAction"
android:title="@string/title_settings"
android:icon="@drawable/ic_settings_black_24dp"/>
</group>
</menu>
这会显示SettingsActivity
,但是当我按下返回按钮返回到MainActivity
第一个目的地时会显示,而不是上一个目的地。即使NavigationView
正确保存了它的状态,并且检查了最后一个目的地(而不是列表中的第一项)。
我也尝试用SettingsActivity
a替换SettingsFragment
,结果相同。
选择全局操作后,如何让导航组件正确保存其状态?
解决方案
根据onNavDestinationSelected()
文档(这是NavigationUI 触发菜单项的方式):
默认情况下,返回堆栈将弹出回导航图的起始目的地。有的菜单项
android:menuCategory="secondary"
不会弹出回栈。
android:menuCategory="secondary"
因此,如果您想在选择设置目标时避免将其他目标从堆栈中弹出,则可以添加到菜单项。
推荐阅读
- android - android.view.ViewRootImpl 无法转换为 android.view.View
- android - Android 创建文件导致 java.io.IOException
- python-3.x - 将文件中的名称分配给索引
- linux - 系统 cron 未运行计划执行的预期进程
- angular - Angular canActive() 不返回值?
- matlab - 如何从matlab中的向量中选择特定百分比的项目?
- php - 带有子类别的结论类别
- javascript - 我可以在 React Storybook 中创建一个旋钮来修改具有 4 个值的数组,其中每个值都有一个选择下拉列表吗?
- r - 将月度数据转换为 R 中的按日表
- mysql - Laravel 分页不会重新初始化 MySQL 变量