这是代码片段。
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the main; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item = menu.findItem(R.id.action_notifications);
LayerDrawable icon = (LayerDrawable) item.getIcon();
// Update LayerDrawable's BadgeDrawable
Utils2.setBadgeCount(this, icon, mNotificationsCount);
return true;
}这是直线上的错误
LayerDrawable icon = (LayerDrawable) item.getIcon();不能将BitmapDrawable转换为android.graphics.drawable.LayerDrawable
如何将BitmapDrawable转换为层LayerDrawable?
编辑:添加setBadgeCount函数。
public static void setBadgeCount(Context context, LayerDrawable icon, int count) {
BadgeDrawable badge;
// Reuse drawable if possible
Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge);
if (reuse != null && reuse instanceof BadgeDrawable) {
badge = (BadgeDrawable) reuse;
} else {
badge = new BadgeDrawable(context);
}
badge.setCount(count);
icon.mutate();
icon.setDrawableByLayerId(R.id.ic_badge, badge);
}发布于 2016-05-09 10:57:39
只有当Drawable实际上是LayerDrawable时,才能将从item.getIcon()获得的icon转换为LayerDrawable,也就是说,如果菜单定义中的icon属性引用了由layer-list定义的可绘制的
从您提到的文章中:菜单定义(本文中的menu/menu_home.xml,您的例子中的menu/main.xml )
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_notifications"
android:title="Notifications"
android:icon="@drawable/ic_menu_notifications"
android:showAsAction="always"/>
</menu>引用的图标(drawable/ic_menu_notifications)应该是一个layer-list:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/ic_notification"
android:drawable="@drawable/ic_action_email"
android:gravity="center" />
<!-- set a place holder Drawable so android:drawable isn't null -->
<item
android:id="@+id/ic_badge"
android:drawable="@drawable/ic_action_email" />
</layer-list>另外,其中一个层应该以ic_badge作为id。这是setBadgeCount()使用的层
https://stackoverflow.com/questions/37110778
复制相似问题