Notification Badge On Action Item Android

后端 未结 6 1069
感动是毒
感动是毒 2020-12-04 06:06

I wana add a notification badge on the cart image placed in action bar and manipulate it programmatically. Any Help?

相关标签:
6条回答
  • 2020-12-04 06:21
        **Create a custom_layout**
    
        ////////
    
        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout
            style="?attr/actionButtonStyle"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clipToPadding="false"
            android:focusable="true">
    
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:src="@drawable/notifications_white"/>
    
            <TextView
                android:id="@+id/cart_badge"
                android:layout_width="20dp"
                android:layout_height="20dp"
                android:layout_marginLeft="55dp"
                android:layout_marginTop="3dp"
                android:background="@drawable/badge_background"
                android:gravity="center"
                android:padding="3dp"
                android:textColor="@android:color/white"
                android:text="0"
                android:textSize="10sp"
                android:visibility="gone"
                />
    
        </FrameLayout>
    
        //////
    
        **Create badge_background**
        /////
    
        <?xml version="1.0" encoding="utf-8"?>
        <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    
            <solid android:color="@android:color/holo_red_dark"/>
            <stroke android:color="@android:color/white" android:width="1dp"/>
    
        </shape>
    
        /////
        **Create main_menu**
    
    ////
        <menu
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto" >
    
            <item
                android:id="@+id/action_cart"
                android:icon="@drawable/notifications_white"
                android:title="Cart"
                app:actionLayout="@layout/custom_layout"
                app:showAsAction="always"/>
    
        </menu>
    
    /////
        **In MainActivty.java**
    
             int count = 0;
            TextView textCartItemCount;
    
    /// build a method inside your MainActivity ////
    
         @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main_menu, menu);
    
                final MenuItem menuItem = menu.findItem(R.id.action_cart);
    
                View actionView = MenuItemCompat.getActionView(menuItem);
                textCartItemCount = (TextView) actionView.findViewById(R.id.cart_badge);
    
                setupBadge();
    
                actionView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onOptionsItemSelected(menuItem);
                    }
                });
    
                return true;
            }
    
            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
    
                switch (item.getItemId()) {
    
                    case R.id.action_cart: {
                        // Do something
                        return true;
                    }
                }
                return super.onOptionsItemSelected(item);
            }
    
            private void setupBadge() {
        ///make a button in MainActivty layout
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (count >= 0) {
                            textCartItemCount.setVisibility(View.VISIBLE);
                            textCartItemCount.setText(String.valueOf(++count));
                        } else {
                            textCartItemCount.setVisibility(View.GONE);`enter code here`
                        }
    
                    }
                });
    
    0 讨论(0)
  • 2020-12-04 06:23

    You can show custom MenuItem on ActionBar by creating a custom layout for MenuItem. To set a custom layout you have to use menu item attribute app:actionLayout.

    Follow below steps to create a Badge on Cart action item. See the attached image for result.

    1. Create a custom layout with ImageView(for cart icon) and TextView(for count value)

    layout/custom_action_item_layout.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        style="?attr/actionButtonStyle"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:focusable="true">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/ic_action_cart"/>
    
        <TextView
            android:id="@+id/cart_badge"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_gravity="right|end|top"
            android:layout_marginEnd="-5dp"
            android:layout_marginRight="-5dp"
            android:layout_marginTop="3dp"
            android:background="@drawable/badge_background"
            android:gravity="center"
            android:padding="3dp"
            android:textColor="@android:color/white"
            android:text="0"
            android:textSize="10sp"/>
    
    </FrameLayout>
    
    1. Create drawable circular badge background using Shape.

    drawable/badge_background.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
    
        <solid android:color="@android:color/holo_red_dark"/>
        <stroke android:color="@android:color/white" android:width="1dp"/>
    
    </shape>
    
    1. Add custom layout to menu item.

    menu/main_menu.xml

    <menu 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto" >
    
        <item
            android:id="@+id/action_cart"
            android:icon="@drawable/ic_action_cart"
            android:title="Cart"
            app:actionLayout="@layout/custom_action_item_layout"
            app:showAsAction="always"/>
    
    </menu>
    
    1. In your MainActivity, add following codes:

    MainActivity.java:

    public class MainActivity extends AppCompatActivity {
        ................
        ......................
        TextView textCartItemCount;
        int mCartItemCount = 10;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            .....................
            ............................
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main_menu, menu);
    
            final MenuItem menuItem = menu.findItem(R.id.action_cart);
    
            View actionView = menuItem.getActionView();
            textCartItemCount = (TextView) actionView.findViewById(R.id.cart_badge);
    
            setupBadge();
    
            actionView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onOptionsItemSelected(menuItem);
                }
            });
    
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            switch (item.getItemId()) {
    
                case R.id.action_cart: {
                    // Do something
                    return true;
                }
            }
            return super.onOptionsItemSelected(item);
        }
    
        private void setupBadge() {
    
            if (textCartItemCount != null) {
                if (mCartItemCount == 0) {
                    if (textCartItemCount.getVisibility() != View.GONE) {
                        textCartItemCount.setVisibility(View.GONE);
                    }
                } else {
                    textCartItemCount.setText(String.valueOf(Math.min(mCartItemCount, 99)));
                    if (textCartItemCount.getVisibility() != View.VISIBLE) {
                        textCartItemCount.setVisibility(View.VISIBLE);
                    }
                }
            }
        }
    
        ..................
        ..............................
    
    }
    

    OUTPUT:

    0 讨论(0)
  • 2020-12-04 06:23

    This answer is an edit to the answer given by Ferdous Ahmed as I can not comment on the answer that is why I am posting new answer.

    I am only reposting MainActivity

    You can show custom MenuItem on ActionBar by creating a custom layout for MenuItem. To set a custom layout you have to use menu item attribute app:actionLayout.

    Create a custom layout with ImageView(for cart icon) and TextView(for count value)

    MainActivity:

    public class MainActivity extends AppCompatActivity {
    ................
    ......................
    TextView textCartItemCount;
    int mCartItemCount = 10;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        .....................
        ............................
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
    
        **FrameLayout actionView = 
                      (FrameLayout)menu.findItem(R.id.action_cart).getActionView();
        textCartItemCount = (TextView) actionView.findViewById(R.id.cart_badge);**
    
        setupBadge();
    
        actionView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(menuItem);
            }
        });
    
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
    
            case R.id.action_cart: {
                // Do something
                return true;
            }
        }
        return super.onOptionsItemSelected(item);
    }
    
    private void setupBadge() {
    
        if (textCartItemCount != null) {
            if (mCartItemCount == 0) {
                if (textCartItemCount.getVisibility() != View.GONE) {
                    textCartItemCount.setVisibility(View.GONE);
                }
            } else {
                textCartItemCount.setText(String.valueOf(Math.min(mCartItemCount, 99)));
                if (textCartItemCount.getVisibility() != View.VISIBLE) {
                    textCartItemCount.setVisibility(View.VISIBLE);
                }
            }
        }
    }
    
    ..................
    ..............................
    

    }

    0 讨论(0)
  • 2020-12-04 06:29

    Perhaps it will be a faster and easier solution. For example xml:

        <ru.nikartm.support.ImageBadgeView
        android:id="@+id/ibv_icon2"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_marginTop="30dp"
        android:layout_gravity="center"
        android:padding="10dp"
        app:ibv_badgeValue="100"
        app:ibv_badgeTextSize="12sp"
        app:ibv_fixedBadgeRadius="15dp"
        app:ibv_badgeTextStyle="bold"
        app:ibv_badgeTextColor="#ffffff"
        app:ibv_badgeColor="#00ACC1"
        app:ibv_badgeLimitValue="false"
        android:src="@drawable/ic_shopping_cart" />
    

    Or programmatically:

    imageBadgeView.setBadgeValue(27)
                .setBadgeOvalAfterFirst(true)
                .setBadgeTextSize(16)
                .setMaxBadgeValue(999)
                .setBadgeTextFont(typeface)
                .setBadgeBackground(getResources().getDrawable(R.drawable.rectangle_rounded))
                .setBadgePosition(BadgePosition.BOTTOM_RIGHT)
                .setBadgeTextStyle(Typeface.NORMAL)
                .setShowCounter(true)
                .setBadgePadding(4);
    

    I hope this help.

    0 讨论(0)
  • 2020-12-04 06:42

    Simplest hack by giving style.

            <TextView
                    android:id="@+id/fabCounter"
                    style="@style/Widget.Design.FloatingActionButton"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:layout_marginEnd="10dp"
                    android:padding="5dp"
                    android:text="10"
                    android:textColor="@android:color/black"
                    android:textSize="14sp" />
    

    0 讨论(0)
  • 2020-12-04 06:47

    Using https://github.com/nikartm/Image-Support that will take care of creating the badge with more options like max count limit, etc.

    layout_menu_cart.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout style="?attr/actionButtonStyle"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:focusable="true"
        android:clickable="true"
        xmlns:tools="http://schemas.android.com/tools">
    
        <ru.nikartm.support.ImageBadgeView
            android:id="@+id/cart_menu_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/ic_shopping_cart_black"
            tools:ibv_badgeValue="101"
            app:ibv_maxBadgeValue="99"
            app:ibv_badgeTextSize="7sp"
            app:ibv_fixedBadgeRadius="7dp"
            app:ibv_badgeTextStyle="bold"
            app:ibv_badgeTextColor="#ffffff"
            app:ibv_badgeColor="@color/colorAccent"
            app:ibv_badgeLimitValue="true" />
    
    </FrameLayout>
    

    main_menu.xml

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/menu_cart"
            android:title="Cart"
            android:icon="@drawable/ic_shopping_cart_black"
            app:actionLayout="@layout/layout_menu_cart"
            app:showAsAction="always"/>
    </menu>
    

    YourActivity.kt

    val menuItem = menu.findItem(R.id.menu_cart) as MenuItem
    val actionView = menuItem.actionView
    
    actionView.findViewById<ImageBadgeView>(R.id.cart_menu_icon).badgeValue = count
    
    0 讨论(0)
提交回复
热议问题