Есть ли способ показать значок оповещения в официальных элементах меню BottomNavigationView Google, представленных в API 25?

Я пытаюсь BottomNavigationView выпущен в API 25. Я хочу отобразить значок уведомления (например, небольшой синий круг с или без счета в нем) на одном из пунктов меню в нижней панели навигации.

У меня есть выделение селектора, в котором я добавил checked true и проверял ложные состояния с выделенным greyed out, который имеет BLUE-точку на нем. Когда пользователь переходит к другому элементу навигации, вся кнопка меню становится серым и значок. Я знаю, что это связано с тем, что к drawable применяется itemIconTint, что является причиной наличия другого значка цвета, поскольку часть значка не будет работать. Есть ли альтернативный способ достижения этого?

<android.support.design.widget.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/white"
    app:itemIconTint="@color/selector_bottom_nav"
    app:itemTextColor="@color/selector_bottom_nav"
    android:layout_gravity="bottom"
    app:menu="@menu/menu_bottom_nav">
</android.support.design.widget.BottomNavigationView>

Вот как я его использую. Удаление itemIconTint и смена программного программного обеспечения не помогают.

В Android-разработчиках я ничего не нашел, и это довольно новое, но в Интернете нет ничего.

В нижней навигационной панели есть пользовательские библиотеки, но я ищу поддержку в официальной версии.

Любые идеи, кто-нибудь?

Ответ 1

Отвечая на мой собственный вопрос:

Я закончил тем, что добавил 2 ImageViews с ярлыком и visiblity GONE в моем макете. Я вычисляю позиционирование значков следующим образом:

private void calculateBadgesPosition() {
int totalNavItems = 3;
        for(int i = 0 ; i < bottomNavigation.getChildCount() ; i++) {
            View view =  bottomNavigation.getChildAt(i);

// Since Y remains same for all badges at least in my case.
// 1.3 is a factor that fits my placement of badge.
            double y = getResources().getDisplayMetrics().heightPixels - (view.getMeasuredHeight() * 1.3);
            if(image2ndItemBadge != null) {
                float x = getResources().getDisplayMetrics().widthPixels/2 + imageClassroomBadge.getMeasuredWidth()/2;

                image2ndItemBadge.setX(x);
                image2ndItemBadge.setY((float)y);
                image2ndItemBadge.requestLayout();
            }
// Since BottomNavigationView items are equally distributed you can find
// the right position for 3rd item (in my case last item) by dividing
// BottomNavigationView width by 3 and then by 2 to get the middle of that
// item, which was needed in my case.
            if(image3rdItemBadge != null) {
                float x = getResources().getDisplayMetrics().widthPixels - ((view.getMeasuredWidth()/totalNavItems)/2);

                image3rdItemBadge.setX(x);
                image3rdItemBadge.setY((float)y);
                image3rdItemBadge.requestLayout();
            }
            // BottomNavigationView count should always be 1 
            // but I observed the count was 2 in API 19. So I break after first iteration. 
            break;
        }
    }

Вы можете удалить цикл for и просто проверить, подсчитан ли ребенок больше 0 и получить этот ребенок. Я вызываю вышеупомянутый метод в конце onCreate следующим образом:

ViewTreeObserver viewTreeObserver = getWindow().getDecorView().getViewTreeObserver();
            viewTreeObservier.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    calculateBadgesPosition();
                    getWindow().getDecorView().getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });

Значок ImageView, не являющийся частью BottomNavigationView Элемент drawable не будет выполняться оттенком, который BottomNavigationView применяется при выборе /un выборе элемента. Также, если вы видите, что ваш значок не появляется, попробуйте дать ему более высокий elevation 8 или 16 или что-то еще. В моем случае мой значок остался BottomNavigationView, вероятно, потому, что он имеет более высокий уровень или индекс Z.

Я тестировал это с тремя различными размерами экрана, и позиционирование было одинаковым на всех.

Я надеюсь, что это поможет любому, кто сталкивается с подобной проблемой, с официальным BottomNavigationView.

Также, если у вас есть лучший подход, поделитесь им.

Ответ 2

Одним из способов достижения этого является использование двух значков для каждого элемента - одного с значком, а другого без него и замены программно. В качестве альтернативы вместо двух значков вы можете использовать один значок и программно рисовать значок. Таким образом, код может выглядеть примерно так (если вы знаете индекс каждого элемента и можете получить Drawable для каждого):

public static void updateItem(BottomNavigationView bottomNavigationView, int index, Drawable icon) {
    Menu menu = bottomNavigationView.getMenu();
    MenuItem item = menu.getItem(index);

    if (item != null) {
        item.setIcon(icon);
    }
}

Ответ 3

Создайте макет с помощью Textview.

Наклоните представление, добавив BottomNavigationMenuView в качестве дочернего для BottomNavigationView. Добавьте счетчик в требуемое меню.

См. приведенную ниже ссылку.

fooobar.com/info/504633/...