Android底部导航菜单需点击两次才渲染Fragment的问题求助
Android底部导航菜单需点击两次才渲染Fragment的问题求助
嘿,我一眼就揪出你这个问题的根源啦!
你现在用的是setOnItemReselectedListener这个监听,它的触发逻辑是只有当用户重新点击已经处于选中状态的菜单项时才会执行回调。说白了,第一次点击只是把菜单项设为选中状态,并不会触发Fragment切换的代码;第二次点击才会触发onNavigationItemReselected,完成Fragment的替换操作,这就是为啥要点击两次才行。
解决起来超简单,把监听换成setOnItemSelectedListener就搞定了——这个回调会在菜单项首次被选中或者切换选中项时立刻触发,完美匹配你的需求。
修改后的代码如下:
public class MainActivity extends AppCompatActivity { BottomNavigationView bottomNavigationView; ImageButton menuButton; BankLedger bankLedger; Members members; Transactions transactions; Vendors vendors; TextView mainFragmentName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bankLedger = new BankLedger(); members = new Members(); transactions = new Transactions(); vendors = new Vendors(); mainFragmentName = findViewById(R.id.main_fragment_name); bottomNavigationView = findViewById(R.id.main_bottomNavView); // 替换为OnItemSelectedListener,首次选中就触发 bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.bn_bank_ledger) { getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout,bankLedger).commit(); mainFragmentName.setText("BANK LEDGER"); return true; // 返回true表示已处理选中事件,保持菜单项选中状态 } if (item.getItemId() == R.id.bn_member) { getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout, members).commit(); mainFragmentName.setText("MEMBERS"); return true; } if (item.getItemId() == R.id.bn_transactions) { getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout,transactions).commit(); mainFragmentName.setText("TRANSACTIONS"); return true; } if (item.getItemId() == R.id.bn_vendors) { getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout,vendors).commit(); mainFragmentName.setText("VENDORS"); return true; } return false; } }); // 手动初始化默认Fragment,避免首次进入页面时区域空白 getSupportFragmentManager().beginTransaction().replace(R.id.main_frameLayout,bankLedger).commit(); mainFragmentName.setText("BANK LEDGER"); bottomNavigationView.setSelectedItemId(R.id.bn_bank_ledger); } //end of oncreate method }
另外给你两个小提醒:
onNavigationItemSelected需要返回boolean值,返回true能让系统保持该菜单项的选中状态,避免出现选中状态乱跳的情况;- 虽然你调用了
setSelectedItemId,但手动初始化一次默认Fragment会更稳妥,某些场景下系统不会自动触发选中事件,提前渲染能避免页面空白。
备注:内容来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

