Aktionsleisten-Benachrichtigungszählsymbol (Abzeichen) wie bei Google

146

Gibt es ein Android-Standardabzeichen oder eine Methode zum Anzeigen des Benachrichtigungssymbols für die Aktionsleiste mit einer Anzahl wie in Google-Beispielen?

Zähle 3 auf dem Bild

Wenn nicht, wie kann man es dann am besten machen?
Ich bin neu in Android, bitte helfen Sie.

AndrewS
quelle
Ich habe meine Antwort aktualisiert, um einen Link zu einer vollständigen Implementierung des Benachrichtigungssymbols zu erstellen.
pqn

Antworten:

228

Ich bin mir nicht sicher, ob dies die beste Lösung ist oder nicht, aber es ist das, was ich brauche.

Bitte sagen Sie mir, wenn Sie wissen, was für eine bessere Leistung oder Qualität geändert werden muss. In meinem Fall habe ich einen Knopf.

Benutzerdefiniertes Element in meinem Menü - main.xml

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

Benutzerdefinierte Form zeichnbar (Hintergrundquadrat) - 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 für meine Ansicht - 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 - Einstellen und Aktualisieren meiner Ansicht

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();
}
AndrewS
quelle
53
Es ist toll ! Wenn Sie jedoch AppCompat verwenden, sollten Sie das ActionLayout im Code festlegen:MenuItem item = menu.findItem(R.id.badge); MenuItemCompat.setActionView(item, R.layout.feed_update_count); notifCount = (Button) MenuItemCompat.getActionView(item);
Sylphe
7
supportInvalidateOptionsMenu () muss anstelle von invalidateOptionsMenu () verwendet werden, wenn Sie eine API-Stufe unter 11
anstreben
10
+1 hat sehr geholfen! Allerdings: Sie benötigen den android:icon="..."im Menüpunkt XML nicht. Das android:actionLayout="..."ist genug da. Für die Buttonim Layout XML, Sie können den selbstschließenden Tag verwenden , <Button ... />weil der Tag nicht Inhalt haben kann. Sie müssen das <shape>Tag schließen (wieder: selbstschließend). Und das brauchst du nicht invalidateOptionsMenu(). Für mich funktioniert das nicht einmal, da das Abzeichen immer wieder aus XML aufgeblasen wird. Das Ganze setNotifCount(...)ist also nutzlos. Rufen Sie einfach setText(...)das Abzeichen an. Und Sie können direkt getActionView()zu Buttonbesetzen.
Caw
4
Wenn Sie AppCompat verwenden, sollten Sie auch das Badge-XML-Menü <menu xmlns: android = " schemas.android.com/apk/res/android " xmlns: appcompat = " schemas.android.com/apk/res-auto "> ändern <item android: id = "@ + id / badge" android: actionLayout = "@ layout / feed_update_count" android: icon = "@ drawable / shape_notification" appcompat: showAsAction = "always" /> </ item> </ menu>
Ajdeguzman
4
@Webster notifCount.setOnClickListener (...); das ist alles drinnen
AndrewS
132

Bearbeiten Seit Version 26 der Support-Bibliothek (oder AndroidX) müssen Sie keine benutzerdefinierten Elemente mehr implementieren OnLongClickListener, um den Tooltip anzuzeigen. Nennen Sie dies einfach:

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

Ich werde nur meinen Code teilen, falls jemand so etwas möchte: Geben Sie hier die Bildbeschreibung ein

  • layout / menu / 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

    Hinweis Stil und Android: anklickbare Eigenschaften. Dadurch wird das Layout so groß wie eine Schaltfläche und der Hintergrund wird grau, wenn er berührt wird.

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

    Ein 64x64-Pixel-Bild mit 10 Pixel breiten Auffüllungen von allen Seiten. Sie sollten 8 Pixel breite Auffüllungen haben, aber ich finde, dass die meisten Standardelemente etwas kleiner sind. Natürlich möchten Sie unterschiedliche Größen für unterschiedliche Dichten verwenden.

  • drawable / round_square.xml

    Hier ist # ff222222 (Farbe # 222222 mit Alpha #ff (vollständig sichtbar)) die Hintergrundfarbe meiner Aktionsleiste.

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

    Hier machen wir es anklickbar und aktualisierbar! Ich habe einen abstrakten Listener erstellt, der die Toast-Erstellung auf onLongClick ermöglicht. Der Code stammt aus den Quellen von 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;
        }
    }
Eichhörnchen
quelle
14
Sehr nützlich und beschreibend. Vielen Dank! Das habe ich wirklich gebraucht. Nur um einige Themen hinzuzufügen, die nützlich sein könnten. Sie müssen app:actionLayout="@layout/action_bar_notifitcation_icon"statt setzen, android:actionLayout="@layout/action_bar_notifitcation_icon"wenn Sie MenuItemCompat.getActionViewstatt menu.findItem(R.id.menu_hotlist).getActionView();für Kompatibilitätsprobleme verwenden müssen. MenuItem.getActionViewist nicht kompatibel mit API Level <11.
Reaz Murshed
Notizstil und Android: anklickbare Eigenschaften. Dadurch wird das Layout auf die Größe einer Schaltfläche angepasst und der ausgewählte Hintergrund beim Berühren farbig. Sehr hilfreich!
David
2
es wirkt wie ein Zauber. tnx bro. Aber in meinem Fall verwende ich die Standardsymbolleiste und sollte stattdessen "app: actionLayout =" @ layout / action_bar_notifitcation_icon "verwenden, oder ich bekomme immer wieder null. tnx
Omid Heshmatinia
3
Als Tipp hat Android ein Drawable zur Benachrichtigung. Anstatt eine benutzerdefinierte Form zu erstellen, können Sie den Hintergrund der Textansicht auf @android setzen: drawable / ic_notification_overlay ".
Androidevil
2
Native : android:actionLayout; AppCompat: app:actionLayoutin Ihrem Menüpunkt.
Benoit Duffez
61

Nur um hinzuzufügen. Wenn jemand eine gefüllte Kreisblase implementieren möchte, ist hier der Code (Name 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>

Möglicherweise müssen Sie die Dicke an Ihre Bedürfnisse anpassen.

Geben Sie hier die Bildbeschreibung ein

BEARBEITEN: Hier ist das Layout für die Schaltfläche (nennen Sie es 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>

Im Menü Element erstellen:

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

Um onCreateOptionsMenuauf den Menüpunkt zu verweisen:

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

Legen Sie nach Erhalt der Benachrichtigung für Nachrichten die Anzahl fest:

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

Dieser Code verwendet Iconify-fontawesome .

compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.1.+'
Abdullah Umer
quelle
10
Können Sie bitte den Code für die obige Aktionsleiste angeben? Es sieht ziemlich gut aus.
Nitesh Kumar
Könnten Sie etwas näher darauf eingehen? Einige Code wäre sehr nützlich
Joaquin Iurchuk
@NiteshKhatri Entschuldigung, dass Sie den Code so spät zur Verfügung gestellt haben. Ich fand es einfach. Aber Sie haben so viele positive Stimmen für Ihre Kommentare erhalten, dass es auch anderen Entwicklern schwer fällt.
Abdullah Umer
1
iconify ist eine großartige Bibliothek!
DJDance
Es ist sehr gut, aber die Zahl, Text erscheint auf der linken Seite der Mitte der Runde (Radius). Wie man es löst
Farruh Habibullaev
29

Ich mag keine ActionViewbasierten Lösungen, meine Idee ist:

  1. Erstellen Sie ein Layout mit TextView, das TextViewvon der Anwendung ausgefüllt wird
  2. wenn Sie ein zeichnen müssen MenuItem:

    2.1. Layout aufblasen

    2.2. call measure()& layout()(andernfalls viewist 0px x 0px, es ist zu klein für die meisten Anwendungsfälle)

    2.3. Setze den TextViewText des

    2.4. "Screenshot" der Ansicht machen

    2.6. MenuItemDas Symbol des Sets basiert auf der Bitmap, die in 2.4 erstellt wurde

  3. profitieren!

Das Ergebnis sollte also so etwas wie sein Geben Sie hier die Bildbeschreibung ein

  1. Layout erstellen hier ist ein einfaches Beispiel
<?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_backgroundist der TextViewHintergrund von Grün , der @drawable/ic_menu_galleryhier nicht wirklich benötigt wird, sondern nur, um das Ergebnis des Layouts in der IDE in der Vorschau anzuzeigen.

  1. Code in onCreateOptionsMenu/ hinzufügenonPrepareOptionsMenu

    @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. Implementieren Sie die Build-the-Icon-Methode:

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

Der vollständige Code ist hier: https://github.com/cvoronin/ActionBarMenuItemCounter

cVoronin
quelle
1
camelCaseCoder, wenn Sie die Position des Zählerbildes nach rechts oben ändern möchten, können Sie beispielsweise android: layout_gravity = "top | right" zu den Layout-Eigenschaften von
counterValuePanel hinzufügen
Es ist hilfreich zu wissen, warum Sie keine Actionview-basierten Lösungen bevorzugen. Ist es Komplexität oder Leistung?
Adi
26

Ok, damit die @ AndrewS- Lösung mit der v7 appCompat-Bibliothek funktioniert :

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

Der Rest des Codes ist der gleiche.

ILovemyPoncho
quelle
7
Wenn Sie xmlns: app = " schemas.android.com/apk/res-auto " in Ihrem XML-Layout verwenden, verwenden Sie app: actionLayout = "@ layout / purchasecar_icon" anstelle von android: actionLayout = "@ layout / purchasecar_icon"
Oscar Calderon
3
@OscarCalderon, es ist wahr. Bevor ich NPE bekomme , nachdem ich es geändert habe android:actionLayout, app:actionLayoutfunktioniert es wie Charme.
Shashanth
3

Schauen Sie sich die Antworten auf diese Fragen an, insbesondere die zweite mit Beispielcode:

So implementieren Sie dynamische Werte für Menüpunkte in Android

Wie erhalte ich Text auf einem ActionBar-Symbol?

Soweit ich weiß, müssen Sie Ihre eigene benutzerdefinierte ActionViewImplementierung erstellen . Eine Alternative könnte ein Brauch sein Drawable. Beachten Sie, dass anscheinend keine native Implementierung einer Benachrichtigungsanzahl für die Aktionsleiste vorhanden ist.

BEARBEITEN: Die gesuchte Antwort mit Code: Benutzerdefinierte Benachrichtigungsansicht mit Beispielimplementierung

pqn
quelle
tnx für die Antwort, aber ich verstehe nicht, wie man die Nummer anzeigt, nicht das Symbol wie auf Ihrem ersten Link. Kannst du dabei helfen?
AndrewS
Hast du die anderen Links gelesen? Sie bieten einige Optionen. Zusätzlich können Sie Text in Drawables einfügen, wie in den folgenden zwei Links gezeigt: stackoverflow.com/questions/6691818/… und stackoverflow.com/questions/3972445/…
pqn
Ich gehe tiefer und tiefer mit Ihren Antworten ... Ich habe diesen Code <Layer-Liste xmlns: android = " schemas.android.com/apk/res/android "> <item android: drawable = "@ drawable / shape_notification "/> <item android: drawable =" @ drawable / ic_menu_preferences "/> </ Layer-Liste> und ich muss das Symbol (ic_menu_preferences) durch ein Zeichen mit Text ersetzen. Wie kann ich das machen?
AndrewS
Ich habe nicht viel Erfahrung damit, aber ich glaube, Sie können möglicherweise benutzerdefinierte XML-Attribute für a Drawableüber so etwas wie den Link hier erstellen und dann ein Attribut für Ihre benutzerdefinierte Drawableerstellen, das Text enthält, damit Sie das Ganze erstellen können in XML und passen Sie es an, wie Sie es wünschen. Alternativ können Sie das Drawable in Java hinzufügen, wenn dies zu schwierig ist.
pqn
3

Wenn Sie die Symbolleiste verwenden:

....
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);
}

und rufen Sie in Ihren Ladedaten refreshMenu () auf:

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

Ich habe hier eine sehr gute Lösung gefunden , ich benutze sie mit Kotlin.

Zunächst müssen Sie im Zeichenordner Folgendes erstellen 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>

In Ihrem Activity_MainLayout mögen einige:

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

Und Sie können ändern wie:

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

Ich habe einen besseren Weg gefunden, es zu tun. wenn Sie so etwas verwenden möchten

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie diese Abhängigkeit

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

Erstellen Sie eine XML-Datei in drawable und speichern Sie sie als 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>

Wo immer Sie dieses Abzeichen verwenden möchten, verwenden Sie den folgenden Code in XML. Mithilfe dieser Funktion können Sie das Abzeichen in der oberen rechten Ecke Ihres Bildes oder etwas anderem sehen.

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

Jetzt endlich auf yourFile.java diese 2 einfache Sache verwenden .. 1) Definieren

 NotificationBadge mBadge;

2) Wenn Ihre Schleife oder irgendetwas, das diese Zahl zählt, Folgendes verwendet:

 mBadge.setNumber(your_LoopCount);

Hier, mBadge.setNumber(0) wird nichts zeigen.

Ich hoffe das hilft.

tief bhatt
quelle