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

时间:2016-10-31 21:20:53

标签: android android-support-library android-support-design

使用ASL 25.0 BottomNavigationView我面临一些麻烦,例如以编程方式保存所选项目(或其索引)和所选项目。

4 个答案:

答案 0 :(得分:6)

不幸的是,在此阶段BottomNavigationView中缺少plenty个功能。

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

这是gist to the code

此扩展程序包括:

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

让我们等到ASL开发fix this

答案 1 :(得分:2)

我正在使用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();
        }

答案 2 :(得分:1)

同意尼古拉!

我也创建了自己的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);

这个要点的最大优点是:听众很少,它会显示您之前的选择位置,即使以编程方式设置位置,听众也会做出反应。一切都是用链接写的,如果需要的话可以使用。

答案 3 :(得分:0)

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

我希望它有所帮助。