首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在android中转换可绘制为LayerDrawable

无法在android中转换可绘制为LayerDrawable
EN

Stack Overflow用户
提问于 2017-02-09 12:47:30
回答 2查看 3.1K关注 0票数 1

我想在菜单项上显示通知徽章。我的代码是

onPrepareOptionsMenu()

代码语言:javascript
复制
    int cartSize = MyCart.getCartSize();
    MenuItem cartItem = menu.findItem(R.id.toolbar_ic_cart);

    if (cartSize > 0) {
        LayerDrawable icon = (LayerDrawable) cartItem.getIcon();
        NotificationBadgeCount.setBadgeCount(this, icon, String.valueOf(cartSize));
    } else {
        cartItem.setIcon(R.drawable.ic_cart_empty);
    }

menu/toolbar_menu.xml

代码语言:javascript
复制
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/toolbar_ic_search"
        android:title="Search"
        android:icon="@drawable/ic_search"
        app:showAsAction="always" />

    <item
        android:id="@+id/toolbar_ic_cart"
        android:title="Cart"
        android:icon="@drawable/ic_cart_menu"
        app:showAsAction="always" />

</menu>

@drawable/ic_cart_menu

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@drawable/ic_cart_full"
        android:gravity="center" />

    <!-- set a place holder Drawable so android:drawable isn't null -->
    <item
        android:id="@+id/ic_badge"
        android:drawable="@drawable/ic_cart_empty" />

</layer-list>

这段代码对我来说很好。但是在升级支持库之后,除了Marshmallow之外,我在所有设备上都会出现错误。

下一行错误

代码语言:javascript
复制
LayerDrawable icon = (LayerDrawable) cartItem.getIcon();

棒棒糖出错了。

代码语言:javascript
复制
java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperLollipop cannot be cast to android.graphics.drawable.LayerDrawable

在Kitkat上出错。

代码语言:javascript
复制
java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperKitkat cannot be cast to android.graphics.drawable.LayerDrawable
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 14:15:37

这些包装类都实现了DrawableWrapper,您可以从中获得原始的可绘制性:

代码语言:javascript
复制
import android.support.v4.graphics.drawable.DrawableWrapper;

..。

代码语言:javascript
复制
    LayerDrawable icon = null;
    Drawable drawable = cartItem.getIcon();
    if (drawable instanceof DrawableWrapper) {
        drawable = ((DrawableWrapper)drawable).getWrappedDrawable();
    }
    icon = (LayerDrawable) drawable;
票数 1
EN

Stack Overflow用户

发布于 2017-02-09 12:54:46

这是因为DrawableWrapperLollipopDrawableWrapperKitkatDrawableWrapperKitkat扩展到了其他一些较老的水泡,等等。但是父类是Drawable而不是LayerDrawable。这就是出现例外的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42137157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档