2016-05-09 3 views
3

Это фрагмент кода.Как отличить BitmapDrawable к LayerDrawable в android

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

'LayerDrawable' не является« BitmapDrawable ». Вы не можете отдать его другому. – Blackbelt

+0

@Blackbelt Спасибо за ответ, Тогда какое лучшее решение для этой проблемы. Я добавил setBadgeCount() в сообщение. –

+0

Что такое 'BadgeDrawable'? В чем проблема? – Blackbelt

ответ

3

Вы можете только кастовал Drawable вы получаете от item.getIcon() к LayerDrawable, если он на самом деле является 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 как идентификатор. Это слой, используемый setBadgeCount()

+0

Я использовал этот код и все еще ошибку MenuItem item = menu.findItem (R.id.action_notifications); LayerDrawable icon = (LayerDrawable) item.getIcon(); // Обновить LayerDrawable BadgeDrawable Utils2.setBadgeCount (это, значок, 2); – ViramP

+0

Ошибка: java.lang.ClassCastException: android.graphics.drawable.BitmapDrawable не может быть добавлен в android.graphics.drawable.LayerDrawable – ViramP