我在新发布的Size
(在设计支持库中)遇到了一个奇怪的问题。如果您有超过3个选项卡(我有5个选项卡),并且在设备或模拟器上的开发人员选项中启用了Bottom Navigation View
,并且您在具有底部导航视图的活动之上启动了新活动(可能来自你的一个片段),并在几秒后关闭它(稍等一下以确保旧的活动被Android杀死),底部导航视图中所有选项卡的标签都会更改为最后一个标签的标签,即你有一个标签,最后一个标签的标签,在所有标签中重复。问题很奇怪,因为菜单是从菜单xml文件中膨胀的,其中定义了图标和标签,但图标显示正确,而标签则没有。我感谢任何帮助。
我报告了这个错误。如果您遇到同样的问题,请为错误here添加错误,以帮助修复错误。
答案 0 :(得分:0)
问题在于freezeText属性。如果您已在styles.xml中全局启用了freezeText(对于所有TextView),请执行以下操作:
<style name="Text" parent="android:Widget.TextView">
<item name="android:freezesText">true</item>
</style>
您需要在BottomNavigationView使用的TextView上禁用此属性,因为它将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()));
}
}