我偶然发现了有关 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 不为空。我很困惑...