我正在尝试将底部工作表导航状态移动到 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/