MenuItem.setIcon генерирует исключение NullPointerException при использовании BottomNavigationBar

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

final Menu menu = bottomNavigationView.getMenu();

notificationBullet = new NotificationDotDrawable(Color.Red, false, this);
final MenuItem nav = menu.findItem(R.id.nav_overview);
final LayerDrawable navMutate = (LayerDrawable) nav.getIcon().mutate();
navMutate.setDrawableByLayerId(R.id.ic_menu_upcoming_dot, notificationBullet);
nav.setIcon(navMutate);

Теперь у меня есть проблема, что последний метод nav.setIcon(navMutate) генерирует исключение NullPointerException.

Это не то nav или же navMutate NULL, это что-то дальше в ОС, вот трассировка стека

Я использую обе переменные здесь:

final LayerDrawable navMutate = (LayerDrawable) nav.getIcon (). mutate ();

navMutate.setDrawableByLayerId (R.id.ic_menu_upcoming_dot,tificationBullet);

ЭТО НЕ МОЖЕТ быть, потому что любой из них является нулевым, иначе он потерпит крах

java.lang.NullPointerException
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:671)
    at android.graphics.drawable.LayerDrawable.createConstantState(LayerDrawable.java:107)
    at android.graphics.drawable.LayerDrawable.<init>(LayerDrawable.java:99)
    at android.graphics.drawable.LayerDrawable$LayerState.newDrawable(LayerDrawable.java:696)
    at android.support.design.internal.BottomNavigationItemView.setIcon(BottomNavigationItemView.java:224)
    at android.support.design.internal.BottomNavigationItemView.initialize(BottomNavigationItemView.java:100)
    at android.support.design.internal.BottomNavigationMenuView.updateMenuView(BottomNavigationMenuView.java:313)
    at android.support.design.internal.BottomNavigationPresenter.updateMenuView(BottomNavigationPresenter.java:64)
    at android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:291)
    at android.support.v7.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:1051)
    at android.support.v7.view.menu.MenuItemImpl.setIcon(MenuItemImpl.java:505)
    at _redacted_.ui.NavActivity.setupBottomNav(NavActivity.java:424)
    at _redacted_.ui.NavActivity.onCreate(NavActivity.java:182)
    at android.app.Activity.performCreate(Activity.java:5231)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    at android.app.ActivityThread.access$800(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

кажется, это происходит только в версиях Android ниже 5 (SDK 16-19)

0 ответов

Вы можете установить значок значка (уведомления) и подсчитать, используя собственный интерфейс

просто добавьте зависимость компонентов материала

implementation 'com.google.android.material:material:1.1.0-alpha09'

и используйте это так:

private fun updateUnreadedMessagesCountView(count: Int) {
        if (count == 0)
            bnv_bottom_navigation.removeBadge(R.id.messagesListFragment)
        else
            bnv_bottom_navigation.getOrCreateBadge(R.id.messagesListFragment).number = count
    }

где R.id.messagesListFragmentэто идентификатор пункта меню. Протестировано на SDK 19

Другие вопросы по тегам