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



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

在视图模型中:枚举类NavTab{TAB_1、TAB_2、TAB_3}

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

在活动中:

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时设置片段。

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

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

您可以考虑这样做:

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

最新更新