0

Я столкнулся с странной проблемой с недавно выпущенным Bottom Navigation View (в Библиотеке поддержки дизайна). Когда у вас есть более 3 вкладок (у меня есть 5 вкладок), а don't keep activities включен в настройках разработчика на устройстве или эмуляторе, и вы начинаете новое действие поверх активности, где у вас есть нижний вид навигации (возможно, от одного ваших фрагментов) и закройте его через несколько секунд (подождите немного, чтобы убедиться, что старая активность была убита Android), метки для всех вкладок в нижнем навигационном представлении меняются на ярлык последней вкладки, т. е. у вас есть один ярлык, один для последней вкладки, повторяющийся во всех вкладках. Проблема странная, потому что меню раздувается из файла xml меню, в котором определены значки и метки, но значки отображаются правильно, а метки не отображаются. Я ценю любую помощь.Ярлык с нижним видом навигации

Я сообщил об этой ошибке. Если вы столкнулись с одной и той же проблемой, попробуйте указать ошибку here, чтобы помочь в определении приоритетов исправления ошибок.

+0

Что вы подразумеваете под неправильным отображением? Можете ли вы опубликовать снимок экрана? –

ответ

0

Проблема была связана с атрибутом freezeText. Если вы включили freezeText глобально (для всех ваших TextViews) в вашем styles.xml, как это:

<style name="Text" parent="android:Widget.TextView"> 
    <item name="android:freezesText">true</item> 
</style> 

вам необходимо отключить этот атрибут на TextViews, используемых BottomNavigationView, так как он кэширует TextViews в бассейне и повторно использует их из бассейна. Существует также ошибка с этим представлением: он всегда возвращает true, даже если слушатель (типа OnNavigationItemSelectedListener) возвращает false. Это вызывает проблемы, когда вы не хотите выбирать новую вкладку, если listener возвращает 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())); 
    } 
}