Android BottomNavigationView ViewModel 以编程方式设置状态

标签 android bottomnavigationview android-viewmodel

我正在尝试将底部工作表导航状态移动到 View 模型。这将使我能够以编程方式设置选项卡,并在旋转时保存选项卡状态。

在 View 模型中: 枚举类 NavTab { TAB_1, TAB_2, TAB_3 }

val navigationTab: LiveData<NavigationTab> = savedStateHandle.getLiveData("nav_tab")
fun setNavigationTab(tab: NavigationTab) {
    savedStateHandle.set("nav_tab", tab)
}

在 Activity 中:

bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnItemSelectedListener(item -> {
    switch (item.getItemId()) {
        case R.id.tab_1:
            viewModel.setNavigationTab(NavTab.TAB_1);
            break;
        case R.id.tab_2:
            viewModel.setNavigationTab(NavTab.TAB_2);
            break;
        case R.id.tab_3:
            viewModel.setNavigationTab(NavTab.TAB_3);
            break;
    }

    return true;
});

viewModel.getNavigationTab().observe(this, this::onNavigationTab);
private void onNavigationTab(NavTab tab) {
    switch (tab) {
        case TAB_1:
            bottomNavigationView.setSelectedItemId(R.id.tab_1);
            break;
        case TAB_2:
            bottomNavigationView.setSelectedItemId(R.id.tab_2);
            break;
        case TAB_3:
            bottomNavigationView.setSelectedItemId(R.id.tab_3);
            break;
    }
}

但是,问题是通过调用 setNavigationTab 以编程方式设置选项卡时,只有 fragment 正在切换选项卡,而未选择属性。我可以打电话

bottomNavigationView.setSelectedItemId(R.id.tab_2);

但是,如果我这样做, View 模型将看到更改并触发观察者,从而导致无限循环。

在以编程方式更改选项卡的情况下,我需要切换 fragment 和 UI 选项卡。如果用户单击选项卡,我只需要设置 fragment ,因为选项卡 UI 会相应更改。

最佳答案

您可以将选项卡标记为已选中,而不设置所选项目,因此不会调用所选项目监听器,如下所示:

bottomNavigationView.getMenu().getItem(0).setChecked(true);

关于Android BottomNavigationView ViewModel 以编程方式设置状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71327222/

相关文章:

Android - 获取用户从图库中选择的图像的路径

android - 膨胀底部导航 View 时出错

android - 为什么底部抽屉导航 fragment 显示空数据

android - 通过观察 ViewModel 在 RecyclerView 中搜索 PagedList 的 LiveData

android - Dao类的实例未正确初始化

android - 每当我清理 adt 项目时,它都会产生 R.layout 和其他一些错误

android - 如何在maven上发布一个库项目?

xamarin.forms - 为什么选项卡不在 Xamarin Forms 的底部?

android - 从 AndroidViewModel 扩展时如何使用 ViewModelProvider.Factory

java - 我的 Xposed 模块有它自己的上下文吗?