Bottom Navigation底部导航图标未随加载Fragment高亮如何解决
问题根因
仅点击底部导航项时才会更新导航选中状态,Fragment内部直接调用FragmentManager替换页面的操作未同步更新BottomNavigationView的选中状态,导致页面和导航高亮不匹配。
解决方案
推荐采用封装公共切换方法的方案,逻辑清晰,易维护:
步骤1:在MainActivity中封装切换逻辑
新增公开方法,统一处理Fragment切换和底部导航高亮更新,同时避免重复操作:
// MainActivity.java 新增方法 public void switchFragment(int targetMenuId) { BottomNavigationView bottomNav = findViewById(R.id.bottom_nav); // 若目标项已选中,跳过操作避免重复执行 if (bottomNav.getSelectedItemId() == targetMenuId) { return; } Fragment targetFragment = null; switch (targetMenuId) { case R.id.one: targetFragment = new Fragment1(); break; case R.id.two: targetFragment = new Fragment2(); break; } if (targetFragment != null) { // 切换Fragment getSupportFragmentManager().beginTransaction() .replace(R.id.body_container, targetFragment) .commit(); // 主动更新底部导航选中项,自动触发高亮 bottomNav.setSelectedItemId(targetMenuId); } }
步骤2:修改底部导航选中监听
直接调用封装好的公共方法,减少冗余代码:
// MainActivity中底部导航OnItemSelectedListener修改后 ((BottomNavigationView)findViewById(R.id.bottom_nav)).setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener(){ @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switchFragment(item.getItemId()); return true; } });
步骤3:修改Fragment内部按钮的点击逻辑
不再直接操作FragmentManager,改为调用MainActivity的公共切换方法:
Fragment1中Btn1点击监听修改为:
if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).switchFragment(R.id.two); }
Fragment2中Btn2点击监听修改为:
if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).switchFragment(R.id.one); }
优化建议
可在MainActivity中缓存Fragment实例,避免每次切换都新建Fragment,减少性能消耗。
内容的提问来源于stack exchange,提问作者Boyapati Sandeep
相关产品推荐
相关产品推荐

