2015-11-16 13 views

risposta

6

Nella mia soluzione, ogni volta che arriva una nuova notifica, il contatore aumenta (come osservato in applicazioni commerciali)

Prova questo, funziona sul mio MOTO e2.

Assicurati che il tuo livello API> 14

Creare un layout simile:

</RelativeLayout> 
    <ImageView 
     android:id="@+id/counterBackground" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/unread_background" /> 

    <TextView 
     android:id="@+id/count" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="1" 
     android:textSize="8sp" 
     android:layout_centerInParent="true" 
     android:textColor="#FFFFFF" /> 
</RelativeLayout> 

In onCreateOptionMenu,

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu_main, menu); 

    MenuItem menuItem = menu.findItem(R.id.testAction); 
    menuItem.setIcon(buildCounterDrawable(count, R.drawable.ic_menu_gallery)); 

    return true; 
} 

Ora, il metodo di costruire per Icon:

private Drawable buildCounterDrawable(int count, int backgroundImageId) { 
    LayoutInflater inflater = LayoutInflater.from(this); 
    View view = inflater.inflate(R.layout.counter_menuitem_layout, null); 
    view.setBackgroundResource(backgroundImageId); 

    if (count == 0) { 
     View counterTextPanel = view.findViewById(R.id.counterValuePanel); 
     counterTextPanel.setVisibility(View.GONE); 
    } else { 
     TextView textView = (TextView) view.findViewById(R.id.count); 
     textView.setText("" + count); 
    } 

    view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 

    view.setDrawingCacheEnabled(true); 
    view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); 
    Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); 
    view.setDrawingCacheEnabled(false); 

    return new BitmapDrawable(getResources(), bitmap); 
} 

è possibile fare riferimento da here

2

Si può fare come segue

voce Personalizzato sul mio menù - main.xml

<item 
    android:id="@+id/badge" 
    android:actionLayout="@layout/feed_update_count" 
    android:icon="@drawable/shape_notification" 
    android:showAsAction="always"> 
</item> 

forma personalizzata disegnabile (sfondo quadrato) - shape_notification.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <stroke android:color="#22000000" android:width="2dp"/> 
    <corners android:radius="5dp" /> 
    <solid android:color="#CC0001"/> 
</shape> 

Layout for my view - feed_update_count.xml

<?xml version="1.0" encoding="utf-8"?> 
<Button xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/notif_count" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:minWidth="32dp" 
    android:minHeight="32dp" 
    android:background="@drawable/shape_notification" 
    android:text="0" 
    android:textSize="16sp" 
    android:textColor="@android:color/white" 
    android:gravity="center" 
    android:padding="2dp" 
    android:singleLine="true">  
</Button> 

MainActivity - impostazione e l'aggiornamento mio punto di vista

static Button notifCount; 
static int mNotifCount = 0;  

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 

    View count = menu.findItem(R.id.badge).getActionView(); 
    notifCount = (Button) count.findViewById(R.id.notif_count); 
    notifCount.setText(String.valueOf(mNotifCount)); 
    return super.onCreateOptionsMenu(menu); 
} 

private void setNotifCount(int count){ 
    mNotifCount = count; 
    invalidateOptionsMenu(); 
} 
+1

Si dà errore su questa linea: - notifCount = (Button) count.findViewById (R.id.notif_count); –

+1

Qual è l'errore – shreyas

+0

Eccezione puntatore nullo –

1

Basta cambiare android:actionLayout="@layout/feed_update_count" a app:actionLayout="@layout/feed_update_count". funzionerà

0

Invece di creare forma e disegnabile, è possibile utilizzare lo stile del badge nello stesso TextView. Usa lo stile di pulsanti fluttuante personalizzato come per il tuo tema.

Esempio-

 <TextView 
       android:id="@+id/fabCounter" 
       style="@style/Widget.Design.FloatingActionButton" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentEnd="true" 
       android:layout_centerVertical="true" 
       android:layout_marginEnd="10dp" 
       android:padding="5dp" 
       android:text="-9" 
       android:textColor="@android:color/black" 
       android:textSize="14sp" /> 

Result