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

Android BottomNavigationView ViewModel setting state programmatically

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

在视图模型中: 枚举 class 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 以编程方式设置选项卡时,只有片段正在切换选项卡未被选择 属性。我可以打电话

bottomNavigationView.setSelectedItemId(R.id.tab_2);

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

在以编程方式更改选项卡的情况下,我需要切换片段和 UI 选项卡。如果用户单击选项卡,我只需要设置片段,因为选项卡 UI 已适当更改。

你可以考虑这样做:

private void onNavigationTab(NavTab tab) {
   bottomNavigationView.setOnItemSelectedListener(null)
   bottomNavigationView.setSelectedItemId(desired_id)
   bottomNavigationView.setOnItemSelectedListener(listener)
}

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

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