গুগলের মতো অ্যাকশনবারের বিজ্ঞপ্তি গণনা আইকন (ব্যাজ)


146

গুগলের উদাহরণগুলির মতো একটি গণনা সহ অ্যাকশন বার বিজ্ঞপ্তি আইকনটি দেখানোর জন্য কি কোনও অ্যান্ড্রয়েড স্ট্যান্ডার্ড ব্যাজ বা পদ্ধতি আছে?

ছবিতে 3 গণনা করুন

যদি তা না হয় তবে এটি তৈরির সর্বোত্তম উপায় কী?
আমি অ্যান্ড্রয়েডে নতুন, দয়া করে সহায়তা করুন।


আমি একটি সম্পূর্ণ বিজ্ঞপ্তি আইকন প্রয়োগের সাথে লিঙ্ক করতে আমার উত্তর আপডেট করেছি।
pqn

উত্তর:


228

আমি নিশ্চিত নই যে এটিই সেরা সমাধান কিনা বা না, তবে এটি আমার প্রয়োজন।

ভাল পারফরম্যান্স বা গুণমানের জন্য কী পরিবর্তন করতে হবে তা আপনি যদি জানেন তবে দয়া করে আমাকে বলুন। আমার ক্ষেত্রে, আমার কাছে একটি বোতাম আছে।

আমার মেনুতে কাস্টম আইটেম - main.xML

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

কাস্টম শেপ অঙ্কনযোগ্য (ব্যাকগ্রাউন্ড স্কোয়ার) - আকৃতি_নোটিকেশন.এক্সএমএল

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

আমার দেখার জন্য লেআউট - ফিড_আপডেট_কাউন্ট.এক্সএমএল

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

মেইনএ্যাকটিভিটি - আমার দর্শন সেট করা এবং আপডেট করা

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
এটা দুর্দান্ত! তবে আপনি যদি অ্যাপক্যাম্প্যাট ব্যবহার করেন তবে আপনার কোডটিতে অ্যাকশন লেআউটটি সেট করা উচিত:MenuItem item = menu.findItem(R.id.badge); MenuItemCompat.setActionView(item, R.layout.feed_update_count); notifCount = (Button) MenuItemCompat.getActionView(item);
সিল্ফ

7
সমর্থনঅনুষ্ঠানিক অপশনস মেনু () অবৈধ অপশন মেনু () এর পরিবর্তে ব্যবহার করা দরকার যদি আপনি 11
বালাজি

10
+1 অনেক সাহায্য করেছে! তবে: আপনার android:icon="..."মেনু আইটেম এক্সএমএলটিতে থাকা দরকার নেই। android:actionLayout="..."সেখানে যথেষ্ট হয়। জন্য Buttonবিন্যাস XML- এর, আপনি করতে পারেন স্ব-ক্লোজিং ট্যাগ ব্যবহার <Button ... />কারণ ট্যাগটি বিষয়বস্তু থাকতে পারে না। আপনাকে <shape>ট্যাগটি বন্ধ করতে হবে (আবার: স্ব-সমাপনি)। এবং আপনার দরকার নেই invalidateOptionsMenu()। আমার জন্য, এটি এমনকি কাজ করে না, কারণ ব্যাজটি সর্বদা এক্সএমএল থেকে আবার স্ফীত হয়। সুতরাং, setNotifCount(...)পুরোটি অকেজো। শুধু setText(...)ব্যাজ কল করুন। আর তুমি কাস্ট করতে পারেন getActionView()থেকে Buttonসরাসরি।
কাবা

4
এছাড়াও, আপনি যদি অ্যাপকম্প্যাট ব্যবহার করেন তবে আপনার ব্যাজ এক্সএমএল মেনু <মেনু এক্সএমএনএলএস: অ্যান্ড্রয়েড = " স্কিমাস.অ্যান্ড্রয়েড. com/apk/ res/android " xmlns: অ্যাপকোম্প্যাট = " স্কিমাস.অ্যান্ড্রয়েড. com/apk/res- auto "> পরিবর্তন করা উচিত <আইটেম অ্যান্ড্রয়েড: আইডি = "@ + আইডি / ব্যাজ" অ্যান্ড্রয়েড: অ্যাকশনলয়আউট = "@ লেআউট / ফিড_আপডেট_কাউন্ট" অ্যান্ড্রয়েড: আইকন = "@ অঙ্কনযোগ্য / আকৃতি_নোটিকেশন" অ্যাপকোম্প্যাট: শোঅ্যাসঅ্যাকশন = "সর্বদা" /> </item> </menu>
আজদেগুজ্জামান

4
@ ওয়েবেস্টার নোটিফকাউন্ট.সেটঅনক্লিকলিস্টার (...);
এগুলি

132

সমর্থন লাইব্রেরির 26 বা সংস্করণটি সম্পাদনা করুন (বা অ্যান্ড্রয়েডেক্স) আপনাকে আর 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

    নোট শৈলী এবং অ্যান্ড্রয়েড: ক্লিকযোগ্য বৈশিষ্ট্য। এগুলি লেআউটটিকে একটি বোতামের আকার দেয় এবং স্পর্শ করলে পটভূমি ধূসর করে তোলে।

    <?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>
  • অঙ্কনযোগ্য-xhdpi / ic_bell.png

    সমস্ত দিক থেকে 10 পিক্সেল প্রশস্ত প্যাডিং সহ একটি 64x64 পিক্সেল চিত্র। আপনার কাছে 8 পিক্সেল প্রশস্ত প্যাডিংস থাকার কথা, তবে আমি বেশিরভাগ ডিফল্ট আইটেমগুলির চেয়ে কিছুটা ছোট দেখতে পাই। অবশ্যই, আপনি বিভিন্ন ঘনত্বের জন্য বিভিন্ন আকারের ব্যবহার করতে চাইবেন।

  • অঙ্কনযোগ্য / rounded_square.xml

    এখানে, # ff222222 (আলফা # एफের সাথে রঙ # 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>
  • কম / 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"MenuItemCompat.getActionViewmenu.findItem(R.id.menu_hotlist).getActionView();MenuItem.getActionView
রিয়াজ মুরশেদ

নোট শৈলী এবং অ্যান্ড্রয়েড: ক্লিকযোগ্য বৈশিষ্ট্য। এগুলি লেআউটটিকে একটি বোতামের আকার দেয় এবং স্পর্শ করার সময় পটভূমিটি রঙিন করে তোলে। খুব দরকারী!
ডেভিড 16

2
ইহা যাদুর মত কাজ করে. tnx ভাই কিন্তু আমার ক্ষেত্রে, আমি ডিফল্ট টুলবার ব্যবহার করুন এবং আমি "অ্যাপ: actionLayout =" ব্যবহার করা উচিত। @ বিন্যাস / action_bar_notifitcation_icon "এর পরিবর্তে বা আমি সবসময় নাল পেতে tnx আবার
Omid Heshmatinia

3
টিপ হিসাবে, অ্যান্ড্রয়েডের বিজ্ঞপ্তিটি আকর্ষণযোগ্য। "অঙ্কনযোগ্য / ic_notification_overlay: তাই, পরিবর্তে একটি কাস্টম আকৃতি তৈরি করার, আপনি @android করার TextView পটভূমিতে সেট করতে পারেন।
androidevil

2
দেশীয়: android:actionLayout; অ্যাপকম্প্যাট: 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));

এই কোডটি আইকনফাই-ফন্টউভাল ব্যবহার করে ।

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

10
আপনি কি দয়া করে উপরের অ্যাকশন বারের জন্য কোড সরবরাহ করতে পারেন? দেখতে বেশ সুন্দর লাগছে।
নীতেশ কুমার

আপনি কি আরও একটু বিস্তারিত বলতে পারেন? কিছু কোড খুব কার্যকর হবে
জোয়াকুইন ইরচুক

@ নিতেশখাত্রি কোড সরবরাহ করতে দেরী হওয়ার জন্য দুঃখিত। আমি ভেবেছিলাম এটা সহজ ছিল। কিন্তু আপনি আপনার মন্তব্যের জন্য এতগুলি সমাহার পেয়েছেন অর্থাত অন্যান্য বিকাশকারীরাও এটির পক্ষে কঠিন।
আব্দুল্লাহ উমার

1
আইকনফাইটি একটি দুর্দান্ত কাজ!
djdance

এটি খুব ভাল, তবে সংখ্যাটি, পাঠটি বৃত্তাকার (ব্যাসার্ধ) মাঝের বাম দিকে প্রদর্শিত হচ্ছে। কীভাবে এটি সমাধান করবেন
ফররুহ হাবিবুল্লাভ

29

আমি ActionViewভিত্তিক সমাধান পছন্দ করি না , আমার ধারণাটি হ'ল:

  1. এর সাথে একটি লেআউট তৈরি করুন TextView, এটি TextViewঅ্যাপ্লিকেশন দ্বারা পপুলেশন হবে
  2. যখন আপনার একটি আঁকতে হবে MenuItem:

    2.1। স্ফীত লেআউট

    2.2। কল measure()& layout()(অন্যথায় 0 viewpx x 0px হবে, বেশিরভাগ ব্যবহারের ক্ষেত্রে এটি খুব ছোট)

    2.3। TextViewএর পাঠ্য সেট করুন

    2.4। দৃশ্যটির "স্ক্রিনশট" তৈরি করুন

    2.6। MenuItem২.৪-তে নির্মিত বিটম্যাপের ভিত্তিতে আইকন সেট করুন

  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
ক্যামেলকেস কোডার, যখন আপনি কাউন্টার চিত্রের অবস্থানটি শীর্ষে ডানদিকে পরিবর্তন করতে চান, আপনি উদাহরণস্বরূপ, অ্যান্ড্রয়েড যুক্ত করতে পারেন: লেআউট_গ্রাভিটি = "শীর্ষ | ডান" পাল্টে ভ্যালুপ্যানেলের লেআউট বৈশিষ্ট্যগুলি
সিভোরোনিন

আপনি অ্যাকশনভিউ ভিত্তিক সমাধানগুলিকে কেন পছন্দ করেন না তা জানতে সহায়ক হবে। এটা জটিলতা বা অভিনয়?
আদি

26

ঠিক আছে, v7 অ্যাপকম্প্যাট লাইব্রেরির সাথে কাজ করার জন্য @ অ্যান্ড্রুসের সমাধানের জন্য :

<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
যদি আপনি আপনার এক্সএমএল লেআউটে xmlns: অ্যাপ = " স্কিমাস.অ্যান্ড্রয়েড. com/apk/res-auto" ব্যবহার করে থাকেন তবে অ্যাপ্লিকেশনটি ব্যবহার করুন: অ্যান্ড্রয়েডের পরিবর্তে অ্যাকশনলয়েট = "@ লেআউট / শপিংকার_আইকন": অ্যাকশনলয়েআউট = "@ লেআউট / শপিংকার_আইকন"
অস্কার ক্যাল্ডেরন

3
@ অস্কারকাল্ডারন, এটি সত্য। আমি এনপিই পাওয়ার আগে, আমি এতে পরিবর্তন android:actionLayoutকরার পরে app:actionLayoutমোহন করার মতো কাজ করে।
শশাথ 8

3

এই প্রশ্নের উত্তরগুলি দেখার চেষ্টা করুন, বিশেষত দ্বিতীয়টি যা স্যাম্পল কোড রয়েছে:

অ্যান্ড্রয়েডে মেনু আইটেমে কীভাবে গতিশীল মানগুলি প্রয়োগ করা যায়

অ্যাকশনবার আইকনটিতে কীভাবে পাঠ্য পাবেন?

আমি যা দেখছি তা থেকে আপনাকে নিজের কাস্টম ActionViewবাস্তবায়ন তৈরি করতে হবে । বিকল্প একটি কাস্টম হতে পারে Drawable। নোট করুন যে অ্যাকশন বারের জন্য কোনও বিজ্ঞপ্তি গণনার কোনও নেটিভ প্রয়োগ নেই বলে মনে হচ্ছে।

সম্পাদনা: কোডটি সহ আপনি যে উত্তরটি সন্ধান করেছিলেন তা: নমুনা বাস্তবায়নের সাথে কাস্টম বিজ্ঞপ্তি দেখুন


উত্তরের জন্য টিএনএক্স, তবে আমি আপনার প্রথম লিঙ্কে আইকনটি না করে নম্বরটি কীভাবে প্রদর্শন করব তা আমি বুঝতে পারি না। আপনি এই সাহায্য করতে পারেন?
অ্যান্ড্রুস

আপনি অন্যান্য লিঙ্কগুলি পড়েছেন? তারা কিছু বিকল্প প্রস্তাব। উপরন্তু আপনি টেক্সট লাগাতে পারেন Drawable: S নিম্নলিখিত দুটি লিঙ্ক দেখা stackoverflow.com/questions/6691818/... এবং stackoverflow.com/questions/3972445/...
pqn

আমি আপনার উত্তরগুলির সাথে আরও গভীর ও গভীরতর হয়ে যাচ্ছি ... আমার কাছে এই কোডটি রয়েছে <লেয়ার-লিস্ট xMLns: android = " স্কিমাস.অ্যান্ড্রয়েড. com/apk/res/android"> <আইটেম অ্যান্ড্রয়েড: অঙ্কনযোগ্য = "@ অঙ্কনযোগ্য / আকৃতি_নোটিকেশন "/> <আইটেম অ্যান্ড্রয়েড: অঙ্কনযোগ্য =" @ অঙ্কনযোগ্য / আইসি_মেনু_প্রিফারেন্সস "/> </layer-list> এবং আমার আইকন (আইকন_মেনু_প্রিফারেন্সস) এর সাথে টেক্সটযুক্ত প্রতিস্থাপন করতে হবে। কিভাবে আমি এটি করতে পারব?
অ্যান্ড্রুস

আমার এটির সাথে খুব বেশি অভিজ্ঞতা নেই তবে আমি বিশ্বাস করি আপনি এখানেDrawable লিঙ্কের মতো কোনও কিছুর মাধ্যমে কাস্টম এক্সএমএল বৈশিষ্ট্য তৈরি করতে সক্ষম হবেন এবং তারপরে আপনার কাস্টমটির জন্য এমন একটি বৈশিষ্ট্য তৈরি করতে সক্ষম হবেন যাতে আপনি পুরো জিনিসটি তৈরি করতে পারেন এক্সএমএলে এবং আপনার ইচ্ছামতো এটি ফিট করুন। বিকল্পভাবে, আপনি জাভাতে অঙ্কনযোগ্য যুক্ত করতে পারেন যদি এটি খুব শক্ত হয়। Drawable
pqn

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

এখন অবশেষে আপনার ফাইল.জভাতে এই 2 সাধারণ জিনিসটি ব্যবহার করুন .. 1) সংজ্ঞা দিন

 NotificationBadge mBadge;

2) যেখানে আপনার লুপ বা যে কোনও কিছু যা এই সংখ্যাটি গণনা করছে এটি ব্যবহার করে:

 mBadge.setNumber(your_LoopCount);

এখানে, mBadge.setNumber(0) কিছুই দেখাবে না।

এই সাহায্য আশা করি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.