Icona del conteggio delle notifiche della barra delle azioni (badge) come ha fatto Google


146

Esiste un badge o un metodo Android standard per mostrare l'icona di notifica della barra delle azioni con un conteggio come negli esempi di Google?

conta 3 sull'immagine

In caso contrario, qual è il modo migliore per farlo?
Sono nuovo di Android, per favore aiutatemi.


Ho aggiornato la mia risposta per collegarmi a un'implementazione completa dell'icona di notifica.
pqn

Risposte:


228

Non sono sicuro che questa sia la soluzione migliore o meno, ma è quello di cui ho bisogno.

Per favore, dimmi se sai cosa è necessario cambiare per migliorare prestazioni o qualità. Nel mio caso, ho un pulsante.

Voce personalizzata nel mio menu - main.xml

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

Disegno personalizzabile forma (quadrato di sfondo) - 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 per la mia vista - 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 aggiornamento della mia 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();
}

53
È ottimo ! Ma se usi AppCompat, dovresti impostare ActionLayout nel codice:MenuItem item = menu.findItem(R.id.badge); MenuItemCompat.setActionView(item, R.layout.feed_update_count); notifCount = (Button) MenuItemCompat.getActionView(item);
Sylphe

7
supportInvalidateOptionsMenu () deve utilizzare invece di invalidateOptionsMenu () se
Balaji

10
+1 Aiutato molto! Tuttavia: non è necessario android:icon="..."nella voce di menu XML. La android:actionLayout="..."basta, c'è. Per l' ButtonXML del layout, è possibile utilizzare il tag a chiusura automatica <Button ... />poiché il tag non può avere contenuto. Devi chiudere il <shape>tag (di nuovo: autochiudente). E non hai bisogno del invalidateOptionsMenu(). Per me, ciò non funziona nemmeno, poiché il badge viene sempre gonfiato nuovamente da XML. Quindi, il tutto setNotifCount(...)è inutile. Basta chiamare setText(...)il badge. E si può lanciare getActionView()a Buttondirettamente.
Caw

4
Inoltre, se si utilizza AppCompat, è necessario modificare il menu badge xml <menu xmlns: android = " schemas.android.com/apk/res/android " xmlns: appcompat = " schemas.android.com/apk/res-auto "> <item android: id = "@ + id / badge" android: actionLayout = "@ layout / feed_update_count" android: icon = "@ drawable / shape_notification" appcompat: showAsAction = "always" /> </item> </menu>
Ajjeguzman,

4
@Webster notifCount.setOnClickListener (...); è tutto dentro
AndrewS,

132

Modifica Dalla versione 26 della libreria di supporto (o androidx) non è più necessario implementare una personalizzazione OnLongClickListenerper visualizzare la descrizione comandi. Basta chiamare questo:

TooltipCompat.setTooltipText(menu_hotlist, getString(R.string.hint_show_hot_message));

Condividerò il mio codice nel caso qualcuno voglia qualcosa del genere: inserisci qui la descrizione dell'immagine

  • Layout / menù / menu_actionbar.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <menu xmlns:android="http://schemas.android.com/apk/res/android">
        ...
        <item android:id="@+id/menu_hotlist"
            android:actionLayout="@layout/action_bar_notifitcation_icon"
            android:showAsAction="always"
            android:icon="@drawable/ic_bell"
            android:title="@string/hotlist" />
        ...
    </menu>
  • layout / action_bar_notifitcation_icon.xml

    Stile nota e android: proprietà cliccabili . questi rendono il layout delle dimensioni di un pulsante e rendono grigio lo sfondo quando toccato.

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_gravity="center"
        android:clickable="true"
        style="@android:style/Widget.ActionButton">
    
        <ImageView
            android:id="@+id/hotlist_bell"
            android:src="@drawable/ic_bell"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_margin="0dp"
            android:contentDescription="bell"
            />
    
        <TextView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/hotlist_hot"
            android:layout_width="wrap_content"
            android:minWidth="17sp"
            android:textSize="12sp"
            android:textColor="#ffffffff"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@null"
            android:layout_alignTop="@id/hotlist_bell"
            android:layout_alignRight="@id/hotlist_bell"
            android:layout_marginRight="0dp"
            android:layout_marginTop="3dp"
            android:paddingBottom="1dp"
            android:paddingRight="4dp"
            android:paddingLeft="4dp"
            android:background="@drawable/rounded_square"/>
    </RelativeLayout>
  • Drawable-xhdpi / ic_bell.png

    Un'immagine di 64x64 pixel con imbottiture larghe 10 pixel da tutti i lati. Dovresti avere padding di 8 pixel di larghezza, ma trovo che la maggior parte degli elementi predefiniti sia leggermente più piccola di quella. Naturalmente, ti consigliamo di utilizzare dimensioni diverse per densità diverse.

  • drawable / rounded_square.xml

    Qui, # ff222222 (colore # 222222 con alpha #ff (completamente visibile)) è il colore di sfondo della mia barra delle azioni.

    <?xml version="1.0" encoding="utf-8"?>
    
    <shape
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <corners android:radius="2dp" />
        <solid android:color="#ffff0000" />
        <stroke android:color="#ff222222" android:width="2dp"/>
    </shape>
  • com / ubergeek42 / WeechatAndroid / WeechatActivity.java

    Qui lo rendiamo cliccabile e aggiornabile! Ho creato un listener astratto che fornisce la creazione di Toast su onLongClick, il codice è stato preso dalle fonti di ActionBarSherlock .

    private int hot_number = 0;
    private TextView ui_hot = null;
    
    @Override public boolean onCreateOptionsMenu(final Menu menu) {
        MenuInflater menuInflater = getSupportMenuInflater();
        menuInflater.inflate(R.menu.menu_actionbar, menu);
        final View menu_hotlist = menu.findItem(R.id.menu_hotlist).getActionView();
        ui_hot = (TextView) menu_hotlist.findViewById(R.id.hotlist_hot);
        updateHotCount(hot_number);
        new MyMenuItemStuffListener(menu_hotlist, "Show hot message") {
            @Override
            public void onClick(View v) {
                onHotlistSelected();
            }
        };
        return super.onCreateOptionsMenu(menu);
    }
    
    // call the updating code on the main thread,
    // so we can call this asynchronously
    public void updateHotCount(final int new_hot_number) {
        hot_number = new_hot_number;
        if (ui_hot == null) return;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (new_hot_number == 0)
                    ui_hot.setVisibility(View.INVISIBLE);
                else {
                    ui_hot.setVisibility(View.VISIBLE);
                    ui_hot.setText(Integer.toString(new_hot_number));
                }
            }
        });
    }
    
    static abstract class MyMenuItemStuffListener implements View.OnClickListener, View.OnLongClickListener {
        private String hint;
        private View view;
    
        MyMenuItemStuffListener(View view, String hint) {
            this.view = view;
            this.hint = hint;
            view.setOnClickListener(this);
            view.setOnLongClickListener(this);
        }
    
        @Override abstract public void onClick(View v);
    
        @Override public boolean onLongClick(View v) {
            final int[] screenPos = new int[2];
            final Rect displayFrame = new Rect();
            view.getLocationOnScreen(screenPos);
            view.getWindowVisibleDisplayFrame(displayFrame);
            final Context context = view.getContext();
            final int width = view.getWidth();
            final int height = view.getHeight();
            final int midy = screenPos[1] + height / 2;
            final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
            Toast cheatSheet = Toast.makeText(context, hint, Toast.LENGTH_SHORT);
            if (midy < displayFrame.height()) {
                cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT,
                        screenWidth - screenPos[0] - width / 2, height);
            } else {
                cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
            }
            cheatSheet.show();
            return true;
        }
    }

14
Molto utile e descrittivo. Grazie! Questo è quello di cui avevo davvero bisogno. Solo per aggiungere alcuni argomenti che potrebbero essere utili. Devi inserire app:actionLayout="@layout/action_bar_notifitcation_icon"invece che android:actionLayout="@layout/action_bar_notifitcation_icon"se devi utilizzare MenuItemCompat.getActionViewinvece di menu.findItem(R.id.menu_hotlist).getActionView();problemi di compatibilità. MenuItem.getActionViewnon è compatibile con il livello API <11.
Reaz Murshed

Stile nota e android: proprietà cliccabili. questi rendono il layout delle dimensioni di un pulsante e rendono lo sfondo selezionato colorato quando viene toccato. Molto utile!
David,

2
Esso funziona magicamente. grazie fratello. ma nel mio caso, utilizzo la barra degli strumenti predefinita e dovrei usare "app: actionLayout =" @ layout / action_bar_notifitcation_icon "invece o ottengo sempre null. tnx di nuovo
Omid Heshmatinia

3
Come suggerimento, Android ha un drawable per la notifica. Quindi, invece di creare una forma personalizzata, puoi impostare lo sfondo di TextView su @android: drawable / ic_notification_overlay ".
androidevil

2
Native: android:actionLayout; AppCompat: app:actionLayoutnella tua voce di menu.
Benoit Duffez,

61

Solo per aggiungere. Se qualcuno vuole implementare una bolla circolare piena, ecco il codice (nominalo bage_circle.xml):

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:useLevel="false"
    android:thickness="9dp"
    android:innerRadius="0dp"
    >

    <solid
        android:color="#F00"
        />
    <stroke
        android:width="1dip"
        android:color="#FFF" />

    <padding
        android:top="2dp"
        android:bottom="2dp"/>

</shape>

Potrebbe essere necessario regolare lo spessore in base alle proprie esigenze.

inserisci qui la descrizione dell'immagine

EDIT: ecco il layout per il pulsante (denominalo badge_layout.xml):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <com.joanzapata.iconify.widget.IconButton
        android:layout_width="44dp"
        android:layout_height="44dp"
        android:textSize="24sp"
        android:textColor="@color/white"
        android:background="@drawable/action_bar_icon_bg"
        android:id="@+id/badge_icon_button"/>

    <TextView
        android:id="@+id/badge_textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/badge_icon_button"
        android:layout_alignRight="@id/badge_icon_button"
        android:layout_alignEnd="@id/badge_icon_button"
        android:text="10"
        android:paddingEnd="8dp"
        android:paddingRight="8dp"
        android:paddingLeft="8dp"
        android:gravity="center"
        android:textColor="#FFF"
        android:textSize="11sp"
        android:background="@drawable/badge_circle"/>
</RelativeLayout>

Nel menu crea elemento:

<item
        android:id="@+id/menu_messages"
        android:showAsAction="always"
        android:actionLayout="@layout/badge_layout"/>

Per onCreateOptionsMenuottenere riferimento alla voce di menu:

    itemMessages = menu.findItem(R.id.menu_messages);

    badgeLayout = (RelativeLayout) itemMessages.getActionView();
    itemMessagesBadgeTextView = (TextView) badgeLayout.findViewById(R.id.badge_textView);
    itemMessagesBadgeTextView.setVisibility(View.GONE); // initially hidden

    iconButtonMessages = (IconButton) badgeLayout.findViewById(R.id.badge_icon_button);
    iconButtonMessages.setText("{fa-envelope}");
    iconButtonMessages.setTextColor(getResources().getColor(R.color.action_bar_icon_color_disabled));

    iconButtonMessages.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (HJSession.getSession().getSessionId() != null) {

                Intent intent = new Intent(getThis(), HJActivityMessagesContexts.class);
                startActivityForResult(intent, HJRequestCodes.kHJRequestCodeActivityMessages.ordinal());
            } else {
                showLoginActivity();
            }
        }
    });

Dopo aver ricevuto la notifica per i messaggi, imposta il conteggio:

itemMessagesBadgeTextView.setText("" + count);
itemMessagesBadgeTextView.setVisibility(View.VISIBLE);
iconButtonMessages.setTextColor(getResources().getColor(R.color.white));

Questo codice utilizza Iconify-fontawesome .

compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.1.+'

10
Potete per favore fornire il codice per la barra delle azioni sopra. Sembra abbastanza buono.
Nitesh Kumar,

Potresti elaborare un po 'di più? Un po 'di codice sarebbe molto utile
Joaquin Iurchuk

@NiteshKhatri mi dispiace per il ritardo nel fornire il codice. Ho pensato che fosse facile. Ma hai ricevuto così tanti voti positivi per i tuoi commenti, il che significa che anche altri sviluppatori lo trovano difficile.
Abdullah Umer,

1
iconify è una grande lib!
djdance,

È molto buono, tuttavia il numero, il testo appare sul lato sinistro del centro del giro (raggio). Come risolverlo
Farruh Habibullaev,

29

Non mi piacciono le ActionViewsoluzioni basate, la mia idea è:

  1. creare un layout con TextView, che TextViewverrà popolato dall'applicazione
  2. quando devi disegnare un MenuItem:

    2.1. gonfiare il layout

    2.2. call measure()& layout()(altrimenti viewsarà 0px x 0px, è troppo piccolo per la maggior parte dei casi d'uso)

    2.3. imposta il TextViewtesto di

    2.4. fare "screenshot" della vista

    2.6. MenuItemicona di set basata su bitmap creata su 2.4

  3. profitto!

quindi, il risultato dovrebbe essere qualcosa di simile inserisci qui la descrizione dell'immagine

  1. creare un layout qui è un semplice esempio
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/counterPanel"
    android:layout_width="32dp"
    android:layout_height="32dp"
    android:background="@drawable/ic_menu_gallery">
    <RelativeLayout
        android:id="@+id/counterValuePanel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

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

@drawable/unread_backgroundè lo TextViewsfondo di quel verde , @drawable/ic_menu_gallerynon è davvero richiesto qui, è solo per visualizzare in anteprima il risultato del layout in IDE.

  1. aggiungi codice in onCreateOptionsMenu/onPrepareOptionsMenu

    @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;
    }
  2. Implementa il metodo build-the-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);
    }

Il codice completo è qui: https://github.com/cvoronin/ActionBarMenuItemCounter


1
camelCaseCoder, quando si desidera modificare la posizione dell'immagine del contatore in alto a destra, è possibile, ad esempio, aggiungere android: layout_gravity = "top | right" per contrastare le proprietà del layout di
ValuePanel

Sarà utile sapere perché non preferisci soluzioni basate su actionview. È complessità o prestazioni?
Adi,

26

Ok, per affinché la soluzione @AndrewS funzioni con la libreria app v7 Compat :

<menu 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:someNamespace="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/saved_badge"
        someNamespace:showAsAction="always"
        android:icon="@drawable/shape_notification" />

</menu>

.

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

    MenuItem item = menu.findItem(R.id.saved_badge);
    MenuItemCompat.setActionView(item, R.layout.feed_update_count);
    View view = MenuItemCompat.getActionView(item);
    notifCount = (Button)view.findViewById(R.id.notif_count);
    notifCount.setText(String.valueOf(mNotifCount));
}

private void setNotifCount(int count){
    mNotifCount = count;
    supportInvalidateOptionsMenu();
}

Il resto del codice è lo stesso.


7
se stai usando xmlns: app = " schemas.android.com/apk/res-auto " nel tuo layout xml, usa l'app: actionLayout = "@ layout / shoppingcar_icon" invece di android: actionLayout = "@ layout / shoppingcar_icon"
Oscar Calderon,

3
@OscarCalderon, è vero. Prima che io sono sempre NPE, dopo ho cambiato android:actionLayoutad app:actionLayoutesso workes come fascino.
Shashanth,

3

Prova a guardare le risposte a queste domande, in particolare la seconda che ha un codice di esempio:

Come implementare valori dinamici sulla voce di menu in Android

Come ottenere testo su un'icona di ActionBar?

Da quello che vedo, dovrai creare la tua ActionViewimplementazione personalizzata . Un'alternativa potrebbe essere un'usanzaDrawable . Si noti che non sembra esserci alcuna implementazione nativa di un conteggio delle notifiche per la barra delle azioni.

EDIT: la risposta che stavi cercando, con il codice: vista di notifica personalizzata con implementazione di esempio


tnx per la risposta, ma non capisco come mostrare il numero, non l'icona come sul tuo primo link. puoi aiutarmi con questo?
AndrewS,

Hai letto gli altri link? Offrono alcune opzioni. Inoltre è possibile inserire testo in Drawables come si vede nei seguenti due link: stackoverflow.com/questions/6691818/... e stackoverflow.com/questions/3972445/...
PQN

sto andando sempre più in profondità con le tue risposte ... ho questo codice <layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item android: drawable = "@ drawable / shape_notification "/> <item android: drawable =" @ drawable / ic_menu_preferences "/> </layer-list> e devo sostituire l'icona (ic_menu_preferences) con un disegno che ha del testo. come posso fare questo?
AndrewS,

Non ho molta esperienza con questo, ma credo che potresti essere in grado di creare attributi XML personalizzati per un Drawablequalcosa come il link qui e quindi creare un attributo per la tua abitudine Drawableche ha del testo su di esso in modo da poter creare il tutto in XML e adattalo come desideri. In alternativa, è possibile aggiungere il Drawable in Java se questo è troppo difficile.
pqn

3

Quando si utilizza la barra degli strumenti:

....
private void InitToolbar() {
    toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    toolbartitle = (TextView) findViewById(R.id.titletool);
    toolbar.inflateMenu(R.menu.show_post);
    toolbar.setOnMenuItemClickListener(this);
    Menu menu = toolbar.getMenu();
    MenuItem menu_comments = menu.findItem(R.id.action_comments);
    MenuItemCompat
            .setActionView(menu_comments, R.layout.menu_commentscount);
    View v = MenuItemCompat.getActionView(menu_comments);
    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // Your Action
        }
    });
    comment_count = (TextView) v.findViewById(R.id.count);
}

e nei tuoi dati di caricamento chiama refreshMenu ():

private void refreshMenu() {
    comment_count.setVisibility(View.VISIBLE);
    comment_count.setText("" + post_data.getComment_count());
}

1

Ho trovato un'ottima soluzione qui , la sto usando con Kotlin.

Innanzitutto, nella cartella di disegno devi creare item_count.xml:

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="8dp" />
<solid android:color="#f20000" />
<stroke
    android:width="2dip"
    android:color="#FFF" />
<padding
    android:bottom="5dp"
    android:left="5dp"
    android:right="5dp"
    android:top="5dp" />
</shape>

Nel tuo Activity_Mainlayout alcuni come:

<RelativeLayout
                    android:id="@+id/badgeLayout"
                    android:layout_width="40dp"
                    android:layout_height="40dp"
                    android:layout_toRightOf="@+id/badge_layout1"
                    android:layout_gravity="end|center_vertical"
                    android:layout_marginEnd="5dp">

                <RelativeLayout
                        android:id="@+id/relative_layout1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content">

                    <Button
                            android:id="@+id/btnBadge"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="@mipmap/ic_notification" />

                </RelativeLayout>

                <TextView
                        android:id="@+id/txtBadge"
                        android:layout_width="18dp"
                        android:layout_height="18dp"
                        android:layout_alignRight="@id/relative_layout1"
                        android:background="@drawable/item_count"
                        android:text="22"
                        android:textColor="#FFF"
                        android:textSize="7sp"
                        android:textStyle="bold"
                        android:gravity="center"/>

            </RelativeLayout>

E puoi modificare come:

btnBadge.setOnClickListener { view ->
        Snackbar.make(view,"badge click", Snackbar.LENGTH_LONG) .setAction("Action", null).show()
        txtBadge.text = "0"
    }

0

Ho trovato il modo migliore per farlo. se vuoi usare qualcosa del genere

inserisci qui la descrizione dell'immagine

Usa questa dipendenza

   compile 'com.nex3z:notification-badge:0.1.0'

crea un file xml in drawable e salvalo come Badge.xml

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

<item>
    <shape android:shape="oval">
        <solid android:color="#66000000"/>
        <size android:width="30dp" android:height="40dp"/>
    </shape>
</item>
<item android:bottom="1dp" android:right="0.6dp">
    <shape android:shape="oval">
        <solid android:color="@color/Error_color"/>
        <size android:width="20dp" android:height="20dp"/>
    </shape>
</item>
</layer-list>

Ora, ovunque tu voglia usare quel badge, usa il seguente codice in xml. con l'aiuto di questo sarai in grado di vedere quel badge nell'angolo in alto a destra della tua immagine o altro.

  <com.nex3z.notificationbadge.NotificationBadge
    android:id="@+id/badge"
    android:layout_toRightOf="@id/Your_ICON/IMAGE"
    android:layout_alignTop="@id/Your_ICON/IMAGE"
    android:layout_marginLeft="-16dp"
    android:layout_marginTop="-8dp"
    android:layout_width="28dp"
    android:layout_height="28dp"
    app:badgeBackground="@drawable/Badge"
    app:maxTextLength="2"
    ></com.nex3z.notificationbadge.NotificationBadge>

Ora finalmente su yourFile.java usa questa 2 semplice cosa .. 1) Definisci

 NotificationBadge mBadge;

2) dove il tuo loop o qualsiasi cosa contando questo numero usi questo:

 mBadge.setNumber(your_LoopCount);

Qui, mBadge.setNumber(0) non mostrerà nulla.

Spero che questo aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.