在屏幕旋转期间保存 BottomNavigationView 所选项目

Save BottomNavigationView selected item during screen rotation

使用 ASL 的 25.0 BottomNavigationView 我遇到了一些麻烦,例如以编程方式保存所选项目(或他的索引)和所选项目。

遗憾的是,现阶段 BottomNavigationView 中缺少 plenty 项功能。

你的问题真的很有趣,我写了这个扩展 BottomNavigationView 来保留状态,在你的情况下,保存最后选择的项目。

这里是gist to the code

此扩展包括:

  • 提供 public 两种以编程方式设置和获取所选项目的方法。
  • 仅为最后一次选择保存和恢复状态。

让我们等到 ASL 开发者 fix this

同意尼古拉!

我也创建了自己的 gist

要在旋转后保存状态,您需要添加给您 Activity:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt("opened_fragment", bottomNavigation.getCurrentItem());
    super.onSaveInstanceState(outState);
}

并进入onCreate方法,刚设置完BottomNavigationView:

final defaultPosition = 0;
final int bottomNavigationPosition = savedInstanceState == null ? defaultPosition :
            savedInstanceState.getInt("opened_fragment", defaultPosition);

bottomNavigation.setCurrentItem(bottomNavigationPosition);

这个要点的最大优点是:侦听器种类很少,它会向您显示之前的选择位置,即使以编程方式设置位置,侦听器也会做出反应。一切都写在link中,如果需要请使用。

我正在使用 BottomNavigationView,这里是应用程序在屏幕旋转时正常工作的代码。 首先,我创建了一个变量来保存所选菜单的 id
private int saveState;

将选择的菜单id取到变量中保存id的值

    @Override
    protected void onResume() {
        super.onResume();
        navigation.setSelectedItemId(saveState);
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        saveState = navigation.getSelectedItemId();
    }

然后在 onCreate 方法中检索可用的 id 值

        if(savedInstanceState!=null){
            navigation.setSelectedItemId(saveState);
        }else{
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.content, MapFragment.newInstance());
            transaction.commit();
        }

我遇到了同样的问题,我所做的是从 25.0.1 更新到 25.3.1 并且它开始工作了正确而无需任何额外的代码。您可以查看 Support Library Revision website 以获取最新版本。

希望对您有所帮助。