动作项Android上的通知徽章

Sub*_*ani 31 android badge android-layout android-actionbar

我在添加到操作栏中的购物车图像上添加了通知徽章,并以编程方式对其进行操作.任何帮助?

Fer*_*med 155

您可以自定义显示MenuItemActionBar通过创建custom layoutMenuItem.要设置自定义布局,您必须使用菜单项属性app:actionLayout.

按照以下步骤创建一个Badgeon Cartaction项目.请参阅附件image中的结果.

  1. 使用ImageView(对于购物车图标)和TextView(对于计数值)创建自定义布局

布局/ 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>
Run Code Online (Sandbox Code Playgroud)
  1. 使用创建可绘制的圆形badge背景Shape.

绘制/ 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>
Run Code Online (Sandbox Code Playgroud)
  1. 添加custom layout到菜单item.

菜单/ 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>
Run Code Online (Sandbox Code Playgroud)
  1. MainActivity中,添加以下代码:

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 = 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() {

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

    ..................
    ..............................

}
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

在此输入图像描述

  • @MNFS在main_menu.xml中使用`app:actionLayout`而不是`android:actionLayout` (8认同)
  • 使用`menuItem.getActionView()`作为`MenuItemCompat.getActionView(menuItem)`不推荐使用 (6认同)
  • @FAT谢谢你们,你再次感谢谢谢......你是个男人 (4认同)
  • 谢谢@Ferdous Ahamed (3认同)
  • 非常感谢你...你刚刚救了一天:D (2认同)
  • 这很有帮助.在Xamarin.Android上尝试过同样的事情并且效果很好. (2认同)

JTN*_*JTN 13

使用适用于 Android (1.3.0)的 Material 组件。

val badge = BadgeDrawable.create(context)
BadgeUtils.attachBadgeDrawable(badge, toolbar, R.id.your_menu_item)
Run Code Online (Sandbox Code Playgroud)


Aks*_*125 6

通过赋予风格最简单的黑客。

        <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" />
Run Code Online (Sandbox Code Playgroud)

结果

  • 如果所有问题都有相同的解决方案,那么它们很可能是重复的问题,但措辞不同。将问题作为重复项关闭有助于*未来的读者* 找到他们正在寻找的解决方案。现在,您的解决方案分布在 5 个以上的帖子中。如果你回来编辑它;或者人们发现错误,现在需要在所有 5 个位置更新。 (4认同)
  • 请停止垃圾邮件相同的答案。相反,将问题标记为重复 (2认同)

Jav*_*vis 6

也许它将是一个更快,更轻松的解决方案。例如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" />
Run Code Online (Sandbox Code Playgroud)

或以编程方式:

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);
Run Code Online (Sandbox Code Playgroud)

屏幕

希望对您有所帮助。