Android登录按钮点击后同时启动两个Activity问题求助
从你的描述和代码来看,登录后本该只启动Promotion,却意外同时打开VendorAccount,而且VendorAccount优先展示,核心原因出在**Promotion里的BottomBar初始化时自动触发了tab选中事件**。
为什么会出现这个问题?
当你在Promotion的onCreate方法中初始化BottomBar时:
bottomBar.setItems(R.menu.bottombars_menu); bottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() { @Override public void onMenuTabSelected(int menuItemId) { if (menuItemId==R.id.tab_account){ startActivity(new Intent(Promotion.this,VendorAccount.class)); } // ...其他tab逻辑 } });
绝大多数BottomBar库在设置完菜单后,默认会自动选中第一个tab,并且会调用onMenuTabSelected回调。如果你的bottombars_menu.xml里第一个item恰好是tab_account,那初始化时就会自动执行跳转VendorAccount的代码,导致两个Activity被连续启动——Promotion先启动(所以先显示它的Toast),紧接着VendorAccount启动并覆盖在上面。
解决方案
这里提供几种简单有效的修复方式,你可以根据需求选择:
方案1:忽略首次初始化的选中事件
添加一个标志位,跳过BottomBar初始化时自动触发的回调,只响应用户手动点击的tab切换:
// 在Promotion类中添加一个成员变量 private boolean isFirstTabSelect = true; // 修改BottomBar的监听器 bottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() { @Override public void onMenuTabSelected(int menuItemId) { // 跳过首次自动选中的事件 if (isFirstTabSelect) { isFirstTabSelect = false; return; } // 原来的tab跳转逻辑 if (menuItemId==R.id.tab_account){ startActivity(new Intent(Promotion.this,VendorAccount.class)); } else if (menuItemId==R.id.tab_details){ startActivity(new Intent(getApplicationContext(),ShowCustomer.class)); } else if (menuItemId==R.id.tab_coupons) { startActivity(new Intent(Promotion.this,ShowCoupons.class)); } } @Override public void onMenuTabReSelected(int menuItemId) { } });
方案2:设置初始选中的tab(不触发回调)
如果你的BottomBar库支持,可以直接指定初始选中的tab,并且关闭自动触发回调的行为:
// 在设置完menu和监听器后,调用selectTabAtPosition,第二个参数设为false(不触发监听器) bottomBar.setItems(R.menu.bottombars_menu); // 假设你想默认选中第0个tab(根据你的menu顺序调整) bottomBar.selectTabAtPosition(0, false);
方案3:调整menu的item顺序
如果允许的话,修改res/menu/bottombars_menu.xml,把你希望默认选中的tab(比如tab_coupons)放在第一个位置,这样初始化时自动选中的就不是tab_account,自然不会触发跳转VendorAccount的逻辑。
验证修复
修改后重新运行,登录后应该只会启动Promotion,显示它的Toast和布局,只有当你手动点击底部的"Account" tab时,才会打开VendorAccount。
内容的提问来源于stack exchange,提问作者Pritom Mazumdar

