Как я могу изменить цвет фона в BadgeDrawable Android - PullRequest
0 голосов
/ 04 июля 2019

Я хочу создать нижнюю навигационную панель со значками.

Я уже сделал это с com.google.android.material.bottomnavigation.BottomNavigationView , который можно найти на https://material.io/develop/android/components/bottom-navigation-view/.

Однако значок красный, и я хочу, чтобы он был желтым.Отсюда я читал документацию: https://material.io/develop/android/components/badging/., но мне это не понятно.

Я уже пытался создать badgeDrawable, установить цвет фона, вызвать функцию attachBadgeDrawable ипередайте ему badgeDrawable и дочерний вид навигации снизу в позиции 3 (где я хочу разместить значок). что мне не понятно, это третий параметр .

Это мой код представления навигации:

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="@color/clr_white"
    app:elevation="0dp"
    app:menu="@menu/menu_bottom_navigator" />



BadgeDrawable badgeDrawable = BadgeDrawable.create(this);
           badgeDrawable.setBackgroundColor(getResources().getColor(R.color.app_yellow));
BadgeUtils.attachBadgeDrawable(badgeDrawable, mBottomNavigation.getChildAt(3), null);

В документации написано:

BadgeUtils.attachBadgeDrawable (badgeDrawable, anchor, null);

Я ожидал, что значок должен быть желтым, но вместо этого я получаю NPE

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myappclient.develop, PID: 15853
    io.reactivex.exceptions.OnErrorNotImplementedException: Attempt to invoke virtual method 'void android.view.View.getDrawingRect(android.graphics.Rect)' on a null object reference
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:704)
        at io.reactivex.internal.functions.Functions$OnErrorMissingConsumer.accept(Functions.java:701)
        at io.reactivex.internal.observers.LambdaObserver.onError(LambdaObserver.java:77)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:67)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:200)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
        at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getDrawingRect(android.graphics.Rect)' on a null object reference

Я использую библиотечную версию com.google.android.material: material: 1.1.0-alpha07, и мой min API равен 19

.

1 Ответ

0 голосов
/ 14 июля 2019

Я рекомендую обновить вашу библиотеку с "альфа-07" до "альфа-08". Также в упражнении у вас есть BottomNavigationView вы можете следующее. Это установит синий цвет фона значка.

Для третьей позиции

    navView.menu.forEachIndexed { index, item ->
        if (index == 2) {
            val badgeDrawable = navView.getOrCreateBadge(item.itemId)
            badgeDrawable.backgroundColor = Color.BLUE
        }
    }

Для последней позиции

    navView.menu.forEachIndexed { index, item ->
        if (index == navView.menu.size() - 1) {
            val badgeDrawable = navView.getOrCreateBadge(item.itemId)
            badgeDrawable.backgroundColor = Color.BLUE
        }
    }
...