You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

横竖屏切换时Bottom Navigation View如何保存选中项位置?

解决Bottom Navigation View横竖屏切换选中状态丢失的问题

这个问题我之前在开发中也碰到过——横竖屏切换时Activity会触发重建,直接导致BottomNavigationView的选中状态和对应Fragment被重置到默认第一项。下面给你两种可靠的解决思路:

方法一:通过实例状态持久化恢复选中位置(推荐)

利用Android生命周期的onSaveInstanceState和onCreate方法,把选中的菜单项ID保存下来,重建后再恢复,具体步骤如下:

  1. 在你的Activity里定义一个状态键常量:
private static final String KEY_SELECTED_NAV_ITEM = "selected_nav_item_id";
  1. 重写onSaveInstanceState,保存当前选中的菜单项ID:
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 将当前选中的BottomNavigationView菜单项ID存入Bundle
    outState.putInt(KEY_SELECTED_NAV_ITEM, binding.bottomNav.getSelectedItemId());
}
  1. 在onCreate中恢复选中状态:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    // 初始化BottomNavigationView的选中监听(你的原有逻辑)
    binding.bottomNav.setOnItemSelectedListener(item -> {
        switch (item.getItemId()) {
            case R.id.nav_home:
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container, new HomeFragment())
                        .commit();
                return true;
            case R.id.nav_profile:
                getSupportFragmentManager().beginTransaction()
                        .replace(R.id.fragment_container, new ProfileFragment())
                        .commit();
                return true;
            // 其他菜单项的切换逻辑
        }
        return false;
    });

    // 从保存的状态中恢复选中位置
    if (savedInstanceState != null) {
        int selectedItemId = savedInstanceState.getInt(KEY_SELECTED_NAV_ITEM);
        binding.bottomNav.setSelectedItemId(selectedItemId);
        // 注意:调用setSelectedItemId会自动触发上面的选中监听,无需额外手动切换Fragment
    }
}

方法二:阻止Activity重建(简单但有局限性)

如果你的横竖屏布局没有明显差异,可以在AndroidManifest.xml中给对应Activity添加configChanges属性,让系统跳过Activity重建:

<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout">
</activity>

这种方式虽然省事,但如果横竖屏需要加载不同布局文件,就需要手动处理布局适配,所以更推荐第一种符合Android生命周期规范的方法。

额外提示:使用Navigation Component的情况

如果你用Jetpack Navigation Component管理BottomNavigationView,正常情况下Navigation会自动保存当前目的地,但如果还是出现状态丢失,可以:

  • 检查NavHostFragment是否正确关联了BottomNavigationView
  • 用方法一中的Bundle保存方式兜底,确保状态不丢失

内容的提问来源于stack exchange,提问作者Вадим Пандрак

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:48:44