0

Я хочу отображать значок оповещения по пункту меню. Мой кодНевозможно использовать Drawable to LayerDrawable в android

onPrepareOptionsMenu()

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); 
    } 

меню/toolbar_menu.xml

<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> 

@ вытяжке/ic_cart_menu

<?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> 

Этот код работал отлично. Но после обновления библиотеки поддержки, я получаю сообщение об ошибке на всех устройствах, кроме Зефир

Ошибка в следующей строке

LayerDrawable icon = (LayerDrawable) cartItem.getIcon(); 

Ошибка на леденец.

java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperLollipop cannot be cast to android.graphics.drawable.LayerDrawable 

Ошибка в Kitkat.

java.lang.ClassCastException: android.support.v4.graphics.drawable.DrawableWrapperKitkat cannot be cast to android.graphics.drawable.LayerDrawable 
+0

Проверьте свой импорт для LayerDrawable, Должно быть это - import android.graphics.drawable.LayerDrawable; –

+0

Да, это то же самое –

ответ

1

Эти классы обертки все реализовать DrawableWrapper, из которого вы можете получить оригинальные вытяжке:

import android.support.v4.graphics.drawable.DrawableWrapper; 

...

LayerDrawable icon = null; 
    Drawable drawable = cartItem.getIcon(); 
    if (drawable instanceof DrawableWrapper) { 
     drawable = ((DrawableWrapper)drawable).getWrappedDrawable(); 
    } 
    icon = (LayerDrawable) drawable; 
+0

не может найти метод getWrappedDrawable(); –

+0

'import android.support.v4.graphics.drawable.DrawableWrapper;' –

+0

Это было 'android.graphics.drawable.DrawableWrapper;' –

1

Это происходит потому, что DrawableWrapperLollipop расширяет DrawableWrapperKitkat и DrawableWrapperKitkat в какой-то другой старой vesrion и так далее .. Но родительский класс Drawable и не LayerDrawable. Это и есть причина исключения.

+0

, но он работал нормально несколько дней назад –

+0

и все еще работает над Marshmallow –

+0

вы можете предложить мне лучшее решение для этой проблемы –