底部导航视图的标签问题

时间:2016-11-15 10:38:39

标签: android android-support-library bottomnavigationview

我在新发布的Size(在设计支持库中)遇到了一个奇怪的问题。如果您有超过3个选项卡(我有5个选项卡),并且在设备或模拟器上的开发人员选项中启用了Bottom Navigation View,并且您在具有底部导航视图的活动之上启动了新活动(可能来自你的一个片段),并在几秒后关闭它(稍等一下以确保旧的活动被Android杀死),底部导航视图中所有选项卡的标签都会更改为最后一个标签的标签,即你有一个标签,最后一个标签的标签,在所有标签中重复。问题很奇怪,因为菜单是从菜单xml文件中膨胀的,其中定义了图标和标签,但图标显示正确,而标签则没有。我感谢任何帮助。

我报告了这个错误。如果您遇到同样的问题,请为错误here添加错误,以帮助修复错误。

1 个答案:

答案 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()));
  }
}