问题出在 freezeText 属性上。如果你在你的 styles.xml 中全局启用了 freezeText(对于你所有的 TextViews),像这样:
<style name="Text" parent="android:Widget.TextView">
<item name="android:freezesText">true</item>
</style>
您需要在 BottomNavigationView 使用的 TextViews 上禁用此属性,因为它将 TextViews 缓存在池中并从池中重用它们。此视图还有一个错误:true
即使侦听器(类型OnNavigationItemSelectedListener
)返回,它也总是返回false
。如果侦听器返回 false(基于某些条件检查,例如用户未登录),当您不想选择新选项卡时,这会导致问题。这也可以通过直接调用侦听器的 onNavigationItemSelected() 来解决。我们添加了以下辅助方法来解决这两个问题:
private void setNavigationItemSelectedListener(BottomNavigationView.OnNavigationItemSelectedListener listener) {
BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0);
for (int i = 0; i < menuView.getChildCount(); i++) {
BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
// Labels are re-used from a pool, if you have global freeze text enabled, this causes state problems
((TextView) itemView.findViewById(android.support.design.R.id.smallLabel)).setFreezesText(false);
((TextView) itemView.findViewById(android.support.design.R.id.largeLabel)).setFreezesText(false);
// Workaround for BottomNavigationMenu bug where it selects the item even if the listener returns false
itemView.setOnClickListener(click -> listener.onNavigationItemSelected(itemView.getItemData()));
}
}