Google की तरह एक्शनबार नोटिफिकेशन आइकन (बैज) है


146

क्या Google उदाहरणों की तरह गणना के साथ एक्शन बार अधिसूचना आइकन दिखाने के लिए एक एंड्रॉइड मानक बैज या विधि है?

चित्र पर 3 गिनें

यदि नहीं, तो इसे बनाने का सबसे अच्छा तरीका क्या है?
मैं Android के लिए नया हूँ, कृपया मदद करें।


मैंने अपना उत्तर पूर्ण अधिसूचना आइकन कार्यान्वयन से लिंक करने के लिए अद्यतन किया है।
pqn

जवाबों:


228

मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है या नहीं, लेकिन यह वही है जो मुझे चाहिए।

कृपया मुझे बताएं कि क्या आप जानते हैं कि बेहतर प्रदर्शन या गुणवत्ता के लिए क्या बदलने की आवश्यकता है। मेरे मामले में, मेरे पास एक बटन है।

मेरे मेनू पर कस्टम आइटम - main.xml

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

कस्टम आकार drawable (पृष्ठभूमि वर्ग) - 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>

मेरे विचार के लिए लेआउट - 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 - मेरे विचार को सेट करना और अपडेट करना

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
यह बहुत अच्छा है ! लेकिन अगर आप AppCompat का उपयोग करते हैं, तो आपको ActionLayout को कोड में सेट करना चाहिए:MenuItem item = menu.findItem(R.id.badge); MenuItemCompat.setActionView(item, R.layout.feed_update_count); notifCount = (Button) MenuItemCompat.getActionView(item);
Sylphe

7
supportInvalidateOptionsMenu () का उपयोग अमान्य करने के बजाय करने की आवश्यकता है .Menu () यदि आप 11 से नीचे एपीआई स्तर के लिए लक्ष्य रखते हैं
बालाजी

10
+1 ने बहुत मदद की! हालाँकि: आपको android:icon="..."मेनू आइटम XML में ज़रूरत नहीं है । android:actionLayout="..."वहाँ पर्याप्त है। के लिए Buttonलेआउट एक्सएमएल में, आप कर सकते हैं स्वतः बंद होने वाले टैग का उपयोग <Button ... />क्योंकि टैग सामग्री नहीं हो सकता। आपको <shape>टैग को बंद करने की आवश्यकता है (फिर से: आत्म-समापन)। और अगर आप की जरूरत नहीं है invalidateOptionsMenu()। मेरे लिए, वह भी काम नहीं करता है, क्योंकि बैज को हमेशा एक्सएमएल से फिर से फुलाया जाता है। तो, पूरा setNotifCount(...)बेकार है। बस setText(...)बिल्ला को बुलाओ । और तुम डाल सकता getActionView()करने के लिए Buttonसीधे।
पंजा

4
इसके अलावा, यदि आप AppCompat का उपयोग करते हैं, तो आपको बैज xml मेनू बदलना चाहिए <मेनू xmlns: android = " schemas.android.com/apk/res/android " xmlns: appcompat = " schemas.android.com/apk/res-auto "> <आइटम Android: id = "@ id / बैज" Android: actionLayout = "@ लेआउट / feed_update_count" Android: icon = "@ drawable / shape_notification" appcompat: showAsAction = "हमेशा" /> </ आइटम> </ मेनू>
अंजडगुजमैन

4
@Webster notifCount.setOnClickListener (...); यह सब अंदर है
एंड्रयूज

132

संपादित समर्थन पुस्तकालय के 26 संस्करण के बाद से (या androidx) आप एक कस्टम को लागू करने की आवश्यकता नहीं OnLongClickListenerटूलटिप प्रदर्शित करने के लिए। बस इसे कॉल करें:

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

अगर कोई ऐसा कुछ चाहता है तो मैं सिर्फ अपना कोड साझा करूंगा: यहाँ छवि विवरण दर्ज करें

  • लेआउट / मेनू / 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>
  • लेआउट / action_bar_notifitcation_icon.xml

    नोट शैली और Android: क्लिक करने योग्य गुण। ये लेआउट को एक बटन के आकार का बनाते हैं और स्पर्श करने पर पृष्ठभूमि को ग्रे बनाते हैं।

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

    64x64 पिक्सेल की छवि जिसमें चारों ओर से 10 पिक्सेल चौड़ी गद्दी है। आपके पास 8 पिक्सेल चौड़ी गद्दी होनी चाहिए, लेकिन मुझे लगता है कि अधिकांश डिफ़ॉल्ट आइटम उससे थोड़े छोटे हैं। बेशक, आप विभिन्न घनत्वों के लिए विभिन्न आकारों का उपयोग करना चाहते हैं।

  • drawable / rounded_square.xml

    यहाँ, # ff222222 (अल्फा #ff के साथ रंग # 222222 (पूरी तरह से दिखाई देने वाला)) मेरे एक्शन बार का बैकग्राउंड कलर है।

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

    यहाँ हम इसे क्लिक करने योग्य और अद्यतन करने योग्य बनाते हैं! मैंने एक अमूर्त श्रोता तैयार किया जो ऑनलॉन्गक्लिक पर टोस्ट निर्माण प्रदान करता है, कोड एक्शनबेरलॉक के स्रोतों से लिया गया था ।

    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
बहुत उपयोगी और वर्णनात्मक। धन्यवाद! यही मैं वास्तव में जरूरत थी। बस कुछ विषयों को जोड़ने के लिए जो उपयोगी हो सकते हैं। यदि आप संगतता समस्याओं के लिए उपयोग करना चाहते हैं app:actionLayout="@layout/action_bar_notifitcation_icon", android:actionLayout="@layout/action_bar_notifitcation_icon"तो आपको इसके बजाय रखना होगा । एपीआई स्तर <11. के साथ संगत नहीं हैMenuItemCompat.getActionViewmenu.findItem(R.id.menu_hotlist).getActionView();MenuItem.getActionView
रेयाज़ मुरशेड

नोट शैली और Android: क्लिक करने योग्य गुण। ये लेआउट को एक बटन के आकार का बनाते हैं और पृष्ठभूमि को छूने पर रंगीन बनाते हैं। बहुत उपयोगी!
डेविड

2
यह एक जादू की तरह काम करता है। tnx भाई लेकिन मेरे मामले में, मैं डिफ़ॉल्ट टूलबार का उपयोग करता हूं और मुझे इसके बजाय "ऐप: एक्शनलाईट =" @ लेआउट / एक्शन_बार_नोटिफिटेशन_इकोन "का उपयोग करना चाहिए या मैं हमेशा शून्य हो जाता हूं। फिर से tnx
ओमिड हिमेशिया

3
एक टिप के रूप में, एंड्रॉइड में अधिसूचना के लिए एक ड्रॉबल है। "Drawable / ic_notification_overlay: तो, बजाय एक कस्टम आकार बनाने के बजाय, आप @Android को TextView की पृष्ठभूमि सेट कर सकते हैं।
androidevil

2
मूल android:actionLayout:; AppCompat: app:actionLayoutआपके मेनू आइटम में।
बेनोइट डफेज़

61

बस जोड़ना है। यदि कोई भरे हुए सर्कल बबल को लागू करना चाहता है, तो कोड को नाम दिया गया है (इसे नाम दें 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>

आपको अपनी आवश्यकता के अनुसार मोटाई को समायोजित करना पड़ सकता है।

यहाँ छवि विवरण दर्ज करें

संपादित करें: यहां बटन के लिए लेआउट है (इसे नाम दें 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>

मेनू में आइटम बनाएं:

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

में onCreateOptionsMenuमेनू आइटम करने के लिए मिलता संदर्भ:

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

संदेशों के लिए सूचना प्राप्त करने के बाद, गिनती सेट करें:

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

यह कोड Iconify-fontawesome का उपयोग करता है ।

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

10
क्या आप उपरोक्त एक्शन बार के लिए कोड प्रदान कर सकते हैं। यह बहुत अच्छा लग रहा है।
नितेश कुमार

क्या आप थोड़ा और विस्तृत कर सकते हैं? कुछ कोड बहुत उपयोगी होंगे
जोकिन इराचुक

@ नीतेश खत्री को कोड प्रदान करने में इतनी देर करने का खेद है। मुझे लगा कि यह आसान है। लेकिन आपको अपनी टिप्पणियों के लिए इतने उतार-चढ़ाव का मतलब है कि अन्य डेवलपर्स को भी मुश्किल हो रहा है।
अब्दुल्ला उमेर

1
iconify एक बहुत अच्छा काम है!
djdance

यह बहुत अच्छा है, हालांकि संख्या, पाठ राउंड के मध्य में बाईं ओर दिखाई दे रहा है (त्रिज्या)। इसे कैसे हल करें
Farruh Habibullaev

29

मुझे ActionViewआधारित समाधान पसंद नहीं हैं, मेरा विचार है:

  1. के साथ एक लेआउट बनाएं TextView, जो कि TextViewएप्लिकेशन द्वारा पॉप्युलेट किया जाएगा
  2. जब आपको एक ड्रॉ करने की आवश्यकता होती है MenuItem:

    2.1। फुलाया लेआउट

    2.2। कॉल measure()& layout()(अन्यथा view0px x 0px होगा, यह अधिकांश उपयोग के मामलों के लिए बहुत छोटा है)

    2.3। TextViewपाठ सेट करें

    2.4। दृश्य का "स्क्रीनशॉट" बनाएं

    2.6। MenuItem2.4 पर बनाए गए बिटमैप के आधार पर सेट आइकन

  3. फायदा!

इसलिए, परिणाम कुछ ऐसा होना चाहिए यहाँ छवि विवरण दर्ज करें

  1. यहां लेआउट बनाएं एक सरल उदाहरण है
<?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यह हरे रंग TextViewकी पृष्ठभूमि है, @drawable/ic_menu_galleryवास्तव में यहाँ की आवश्यकता नहीं है, यह सिर्फ आईडीई में लेआउट के परिणाम का पूर्वावलोकन करने के लिए है।

  1. में कोड जोड़ें 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. बिल्ड-द-आइकन विधि लागू करें:

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

पूरा कोड यहाँ है: https://github.com/cvoronin/ActionBarMenuItemCounter


1
CamelCaseCoder, जब आप काउंटर छवि के स्थान को शीर्ष दाईं ओर बदलना चाहते हैं, तो आप उदाहरण के लिए, android जोड़ सकते हैं: Layout_gravity = "top | right" को counterValuePanel के लेआउट गुण
cVoronc

यह जानना उपयोगी होगा कि आप एक्शनव्यू आधारित समाधान क्यों पसंद नहीं करते हैं। क्या यह जटिलता या प्रदर्शन है?
आदि

26

ठीक है, के लिए @AndrewS साथ काम करने के लिए समाधान v7 appCompat पुस्तकालय :

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

बाकी कोड समान है।


7
यदि आप अपने xml लेआउट में xmlns: app = " schemas.android.com/apk/res-auto " का उपयोग कर रहे हैं , तो ऐप का उपयोग करें: actionLayout = "@ लेआउट / shoppingcar_icon" के बजाय Android: actionLayout = "@ लेआउट / shoppingcar_icon"
ऑस्कर काल्डेरन

3
@ ऑस्करकैल्डरन, यह सच है। इससे पहले कि मैं NPE कर रहा हूं, उसके बाद मैंने इसे बदल दिया android:actionLayout, app:actionLayoutयह आकर्षण की तरह काम करता है।
शशांथ

3

इन प्रश्नों के उत्तरों को देखने का प्रयास करें, विशेष रूप से दूसरा जो नमूना कोड है:

एंड्रॉइड में मेनू आइटम पर गतिशील मूल्यों को कैसे लागू किया जाए

एक्शनबार आइकन पर टेक्स्ट कैसे प्राप्त करें?

मैं जो देखता हूं, उससे आपको अपना स्वयं का कस्टम ActionViewकार्यान्वयन बनाने की आवश्यकता होगी । एक विकल्प एक रिवाज हो सकता है Drawable। ध्यान दें कि एक्शन बार के लिए अधिसूचना गणना का कोई मूल कार्यान्वयन नहीं प्रतीत होता है।

संपादित करें: आप जिस उत्तर की तलाश कर रहे थे, कोड के साथ: नमूना कार्यान्वयन के साथ कस्टम अधिसूचना दृश्य


उत्तर के लिए tnx, लेकिन मुझे समझ में नहीं आता कि नंबर कैसे दिखाना है, अपने पहले लिंक पर आइकन की तरह नहीं। क्या आप इससे मेरी सहायता कर सकते हैं?
एंड्रयूज जूल

क्या आपने अन्य लिंक पढ़े हैं? वे कुछ विकल्प प्रदान करते हैं। इसके अतिरिक्त, आप Drawableनिम्नलिखित दो लिंक्स में देखे गए अनुसार टेक्स्ट डाल सकते हैं : stackoverflow.com/questions/6691818/… और stackoverflow.com/questions/3972445/…
pqn

मैं आपके उत्तर के साथ और अधिक गहरा जा रहा हूं ... मेरे पास यह कोड है <परत-सूची xmlns: android = " schemas.android.com/apk/res/android "> <आइटम Android: drawable = "@ drawable / shape_notification "/> <आइटम Android: drawable =" @ drawable / ic_menu_preferences "/> </ परत-सूची> और मुझे ऐसे आइकॉन (ic_menu_preferences) को बदलने योग्य बनाने की आवश्यकता है जिनमें पाठ है। मैं यह कैसे कर सकता हूँ?
एंड्रयूज जूल

मेरे पास इसके बारे में अधिक अनुभव नहीं है, लेकिन मेरा मानना ​​है कि आप यहाँDrawable लिंक जैसी किसी चीज़ के लिए कस्टम XML विशेषताएँ बनाने में सक्षम हो सकते हैं और फिर अपने कस्टम के लिए एक विशेषता Drawableबना सकते हैं, जिसके ऊपर पाठ हो ताकि आप पूरी चीज़ बना सकें XML में और अपनी इच्छानुसार इसे फिट करें। वैकल्पिक रूप से, यदि आप यह बहुत कठिन है, तो आप जावा में ड्राबल को जोड़ सकते हैं।
पीकेएन

3

जब आप टूलबार का उपयोग करते हैं:

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

और अपने लोड डेटा कॉल में ताज़ा करें ():

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

1

मुझे यहां एक बहुत अच्छा समाधान मिला , मैं इसे कोटलिन के साथ उपयोग कर रहा हूं।

सबसे पहले, ड्रा करने योग्य फ़ोल्डर में आपको बनाना होगा 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>

आपके Activity_Mainलेआउट में कुछ इस तरह हैं:

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

और आप की तरह संशोधित कर सकते हैं:

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

0

मुझे इसे करने का बेहतर तरीका मिला। अगर आप कुछ इस तरह का उपयोग करना चाहते हैं

यहाँ छवि विवरण दर्ज करें

इस निर्भरता का उपयोग करें

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

ड्रा करने योग्य में एक xml फ़ाइल बनाएं और इसे बैज.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>

अब जहाँ भी आप उस बैज का उपयोग xml में कोड का उपयोग करना चाहते हैं। इसकी मदद से आप अपनी छवि या किसी भी चीज़ के ऊपरी-दाएँ कोने पर उस बैज को देख पाएंगे।

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

अब अंत में yourFile.java पर इस 2 सरल चीज़ का उपयोग करें .. 1) परिभाषित करें

 NotificationBadge mBadge;

2) जहां आपका लूप या कुछ भी जो इस संख्या की गिनती कर रहा है, उसका उपयोग करें:

 mBadge.setNumber(your_LoopCount);

यहाँ, mBadge.setNumber(0)कुछ भी नहीं दिखाएगा।

उममीद है कि इससे मदद मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.