0

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

我报告了这个错误。如果您遇到同样的问题,请在此处为错误加注星标,以帮助确定错误修复的优先级。

4

1 回答 1

0

问题出在 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()));
  }
}
于 2017-02-18T07:06:49.033 回答