横竖屏切换时Bottom Navigation View如何保存选中项位置?
这个问题我之前在开发中也碰到过——横竖屏切换时Activity会触发重建,直接导致BottomNavigationView的选中状态和对应Fragment被重置到默认第一项。下面给你两种可靠的解决思路:
方法一:通过实例状态持久化恢复选中位置(推荐)
利用Android生命周期的onSaveInstanceState和onCreate方法,把选中的菜单项ID保存下来,重建后再恢复,具体步骤如下:
- 在你的Activity里定义一个状态键常量:
private static final String KEY_SELECTED_NAV_ITEM = "selected_nav_item_id";
- 重写
onSaveInstanceState,保存当前选中的菜单项ID:
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 将当前选中的BottomNavigationView菜单项ID存入Bundle outState.putInt(KEY_SELECTED_NAV_ITEM, binding.bottomNav.getSelectedItemId()); }
- 在
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,提问作者Вадим Пандрак
相关产品推荐
相关产品推荐

