2016-08-18 8 views
1

Я пытаюсь добавить bagde к иконе корзины на моем ActionBar нравится эта картина enter image description hereAndroid 4,0 Корзины значок NullPointerException

, но я столкнулся с проблемой, что для Android 4.0, приложение разбилось. В первый раз, когда я запускаю приложение, он отлично работает, пакет помещается, а затем я нажимаю на значок. Затем приложение показывает мне фрагмент корзины, и когда я нажимаю кнопку «Назад», это когда приложение дает мне исключение нулевого указателя. Я следовал этой обучающей программе http://mobikul.com/adding-badge-count-on-menu-items-like-cart-notification-etc/

Я обнаружил, что проблема возникла из этой строки кода:

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

Потому что, когда я получаю значок, это нуль. Я пытаюсь с этим кодом до получения значка:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { 
     itemCart.setIcon(context.getResources().getDrawable(R.drawable.ic_menu_cart_icon)); 
    } 

но это не работает.

Вот мой ic_menu_car.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:drawable="@drawable/ic_cart_empty" 
     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> 

А вот мой menu.xml:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" > 

    <item 
     android:id="@+id/cart_option" 
     android:orderInCategory="100" 
     android:title="@string/menu_cart" 
     android:icon="@drawable/ic_menu_cart_icon" 
     app:showAsAction="always" /> 

</menu> 

И код:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 

    inflater.inflate(R.menu.home, menu); 

    MenuItem itemCart = menu.findItem(R.id.cart_option); 

    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP) { 
     itemCart.setIcon(context.getResources().getDrawable(R.drawable.ic_menu_cart_icon)); 
    } 

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

    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, R.color.js_pink); 
    } 

    badge.setCount(count); 
    icon.mutate(); 
    icon.setDrawableByLayerId(R.id.ic_badge, badge); 

} 

Кто-нибудь есть такая же проблема ?

ответ

0

После установки LayerDrawble.setDrawableByLayerID()

вызова menu.setIcon();

см ниже пример кода:

частная пустота setBadgeCount (MainNavigationActivity mainNavigationActivity, LayerDrawable значок, количество строк) {

// 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(mainNavigationActivity); 
    } 

    badge.setCount(count); 
    icon.mutate(); 
    icon.setDrawableByLayerId(R.id.ic_badge, badge); 
    itemCart.setIcon(icon); 
}