web-dev-qa-db-fra.com

Comment afficher le nombre de notifications dans l'icône de la barre d'outils sous Android

Je voudrais faire un compteur d'icônes pour Android, tout comme le panier. J'ai vu augmenter le nombre d'icônes de panier d'applications e-commerce. Je montre l'instantané app Flipkart. :-

 enter image description here

6
Anand Jain

Dans ma solution, chaque fois qu'une nouvelle notification arrive, le compteur augmente (comme observé dans les applications d'achat).

Essayez ceci, cela fonctionne sur mon MOTO e2.

Assurez-vous que votre Niveau de l'API> 14

Créez une mise en page comme:

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

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

Maintenant, construisez la méthode pour 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);
}

Vous pouvez vous référer de ici

8
Gaurav Setia

Vous pouvez faire comme suit

Élément personnalisé dans mon menu - main.xml

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

Forme personnalisée pouvant être dessinée (carré d’arrière-plan) - 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>

Mise en page pour ma vue - 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 - Définition et mise à jour de ma vue

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();
}
4
shreyas

Il suffit de changer Android:actionLayout="@layout/feed_update_count" en app:actionLayout="@layout/feed_update_count". Cela fonctionnera 

2
Divyesh Patel

Au lieu de créer une forme et un dessin, vous pouvez utiliser le style de badge dans TextView lui-même. Utilisez simplement un style de bouton flottant personnalisé selon votre thème.

Exemple-

        <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

0
Aks4125