Bottom Navigation选中按钮状态无法持久化问题求助(Java新手)
问题描述
作为Java新手,遇到BottomNavigation选中状态异常:点击底部导航按钮时,仅Home按钮能持续保持激活状态;点击其他按钮时,激活色仅显示1秒,随后自动恢复为Home按钮的激活状态。
问题代码
public class BottomNavigation { public static void setupBottomNavigation(final Activity activity, final BottomNavigationView bottomNavigationView) { bottomNavigationView.setOnItemSelectedListener(item -> { if (item.getItemId() == R.id.bookList) { startActivity(activity, BookListActivity.class); bottomNavigationView.setSelectedItemId(R.id.bookList); // 此行代码无效 return true; } else if (item.getItemId() == R.id.home) { startActivity(activity, MainActivity.class); return true; } else if (item.getItemId() == R.id.writerList) { startActivity(activity, WriterActivity.class); return true; } else if (item.getItemId() == R.id.libraryList) { startActivity(activity, LibraryActivity.class); return true; } else if (item.getItemId() == R.id.contactUs) { startActivity(activity, ContactActivity.class); return true; } else { return false; } }); } private static void startActivity(@NonNull Activity activity, Class<?> cls) { activity.startActivity(new Intent(activity.getApplicationContext(), cls)); activity.overridePendingTransition(0, 0); } }
截图说明
- 点击第一个按钮时,第一个按钮处于激活状态

- 点击第二个菜单,但第二个菜单未处于激活状态

问题原因
当前逻辑是点击按钮后启动新Activity,但每个新启动的Activity中的BottomNavigationView默认选中Home项(要么布局文件默认设置了android:checkedItem="@id/home",要么启动时未主动设置选中项)。原Activity中调用的bottomNavigationView.setSelectedItemId()无效,是因为启动新Activity后,原Activity被推到后台,该设置无法作用于前台的新Activity。
解决方案
1. 在对应Activity中设置选中项
在每个页面的onCreate方法里,找到BottomNavigationView并设置对应导航项为选中状态:
比如BookListActivity:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_book_list); BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation); bottomNav.setSelectedItemId(R.id.bookList); // 设置当前页面对应的导航项选中 }
同理,WriterActivity中设置bottomNav.setSelectedItemId(R.id.writerList);,其余页面以此类推。
2. 优化Activity启动逻辑(可选)
每次点击都创建新Activity实例会导致栈中存在重复页面,既浪费资源也可能引发状态问题。可修改startActivity方法,让已存在的Activity回到前台而非创建新实例:
private static void startActivity(@NonNull Activity activity, Class<?> cls) { Intent intent = new Intent(activity.getApplicationContext(), cls); // 标记若栈中存在该Activity,将其移至前台,不创建新实例 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); activity.startActivity(intent); activity.overridePendingTransition(0, 0); }
该优化能避免重复创建Activity,同时保证选中状态的一致性。
内容的提问来源于stack exchange,提问作者Imran S.
相关产品推荐
相关产品推荐

