4

我偶然发现了有关 ActionBar 上的应用内通知的本教程。

http://www.jmhend.me/layerdrawable-menuitems

在此日志中提到的行上调用 item.getIcon() 时,我得到的只是 android.graphics.drawable.LayerDrawable 内的 NullPointer:http: //pastebin.com/udKPtUzB

我认为这可能与 Android API 版本有关,但我找不到解决方案,因为我无法弄清楚返回“null”的内容。

我应该提到这不会在应用程序启动时发生。仅当我尝试更新可绘制对象以显示计数时才会发生这种情况。

我来发现这是由于item.getIcon()应该返回菜单项的 Drawable 。但它在运行时始终为空。(虽然不是启动)

public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { 
    com.actionbarsherlock.view.MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    menu.findItem(R.id.action_list).setIcon(
            new IconDrawable(this, IconValue.fa_list).colorRes(
                    android.R.color.black).actionBarSize()
    );
    com.actionbarsherlock.view.MenuItem item = menu.findItem(R.id.action_users);
    LayerDrawable icon;
    if (item.getIcon() != null) {
        icon = (LayerDrawable) item.getIcon();
        // Update LayerDrawable's BadgeDrawable
        setBadgeCount(MainActivity.this, icon, privateMsgNotificationCount);
    } else {
    }
    return true;
}

现在是NPE if(item.getIcon()!=null)。该条件永远不会得到测试,因为 getIcon() 会导致 NPE,就像上面提到的 pastebin 日志中一样。

注意:经过 12 小时的测试,我可以肯定地说,每当我将 MenuItem 的 setIcon() 设置为 LayerDrawable 时,getIcon() 为空。如果我将 setIcon() 设置为任何其他类型的可绘制对象,系统将记住 MenuItem 的可绘制对象并且 getIcon 不为空。我很困惑...

4

0 回答 0