MenuItem.setIcon 在使用 BottomNavigationBar 时抛出 NullPointerException

Posted

技术标签:

【中文标题】MenuItem.setIcon 在使用 BottomNavigationBar 时抛出 NullPointerException【英文标题】:MenuItem.setIcon throws NullPointerException when using BottomNavigationBar 【发布时间】:2018-06-03 20:11:44 【问题描述】:

我用底部导航栏替换了抽屉导航,发现我不能再使用动作视图,这就是为什么我使用 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 的问题。

不是 navnavMutate 为空,而是在操作系统中更进一步,这是堆栈跟踪

我在这里使用这两个变量:

最终LayerDrawable navMutate = (LayerDrawable) nav.getIcon().mutate();

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

不可能是因为其中任何一个都是空的,否则它会在那之前崩溃

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)

它似乎只发生在低于 5 的 Android 版本上(所以 SDK 16-19)

【问题讨论】:

What is a NullPointerException, and how do I fix it?的可能重复 @TormundThunderfist 仔细检查您在 xml 中声明的 id @GowthamanM 我肯定有在我的 xml 中声明的 ID。就像我说的,它适用于 sdk21 及更高版本 @KeLiuyue 我假设你是一个机器人,因为我写了我的变量在运行时不为空,我已经检查过了 【参考方案1】:

您可以使用原生界面设置徽章(通知)图标和计数

只需添加材质组件依赖

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 是菜单项的 ID。 在 SDK 19 上测试

【讨论】:

以上是关于MenuItem.setIcon 在使用 BottomNavigationBar 时抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

电脑BOTT设置:最少要有AWATD和AMI俩种,越详细越好,最好是前面按BIOS设置介面一样只是在英文下写上翻译

css 媒体查询反应灵敏。 Primer archivo Principio自下而上(De movil a escritorio),Segundo archivo principio top-bott

sqlserver 怎样取出最后几条数据

ios添加按钮自动布局

php中如何点击完按钮后在本页面实现跳转

在 Flutter 中使用 NavigationRail 和 BottomNavigationBar