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);
我正在尝试将我的底部 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);