ToolBar MenuItem 实现 Badge 数字提醒
2018-11-29 本文已影响63人
wuchao226
ToolBar MenuItem 实现 Badge 数字提醒 需要以下几个步骤:
- 自定义 ActionProvider
- ToolBar 自定义 menu
- ToolBar 右侧menu添加角标
效果预览
数字提醒.png自定义布局,要显示的BadgeView( menu_badge_provider.xml )
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?actionBarItemBackground">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:scaleType="center"
android:src="@drawable/ic_file_download_white_24dp"/>
<TextView
android:id="@+id/tv_badge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_margin="3dp"
android:background="@drawable/shape_circle_red"
android:gravity="center"
android:text="0"
android:textColor="@android:color/white"
android:textSize="12sp"/>
</RelativeLayout>
其中shape_circle_red是红色的圆形背景(shape_circle_red.xml)
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<corners android:radius="10dp" />
<solid android:color="#FF5781" />
<size
android:width="20dp"
android:height="20dp" />
</shape>
自定义ActionProvider
public class BadgeActionProvider extends ActionProvider {
private ImageView mIvIcon;
private TextView mTvBadge;
private View.OnClickListener mOnClickListener;
public BadgeActionProvider(Context context) {
super(context);
}
@Override
public View onCreateActionView() {
//读取support下Toolbar/ActionBar的高度,为了让这个Menu高和宽和系统的menu达到一致。
int size = UiUtils.getDimens(android.support.design.R.dimen.abc_action_bar_default_height_material);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(size, size);
View view = LayoutInflater.from(getContext())
.inflate(R.layout.menu_badge_provider, null, false);
view.setLayoutParams(params);
mIvIcon = view.findViewById(R.id.iv_icon);
mTvBadge = view.findViewById(R.id.tv_badge);
view.setOnClickListener(new BadgeMenuClickListener());
return view;
}
/**
* 设置图标。
*
* @param icon drawable 或者mipmap中的id。
*/
public void setIcon(@DrawableRes int icon) {
mIvIcon.setImageResource(icon);
}
/**
* 设置显示的数字。
*
* @param i 数字。
*/
public void setBadge(int i) {
mTvBadge.setText(Integer.toString(i));
}
/**
* 设置文字。
*
* @param i string.xml中的id。
*/
public void setTextInt(@StringRes int i) {
mTvBadge.setText(i);
}
/**
* 设置显示的文字。
*
* @param i 文字。
*/
public void setText(CharSequence i) {
mTvBadge.setText(i);
}
public void setOnClickListener(View.OnClickListener onClickListener) {
mOnClickListener = onClickListener;
}
private class BadgeMenuClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
if (mOnClickListener != null) {
mOnClickListener.onClick(v);
}
}
}
}
使用自定义的ActionProvider及自定义menu(toolbar_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/action_download"
android:title=""
app:actionProviderClass="com.wuc.store.widgets.BadgeActionProvider"
app:showAsAction="always"/>
</menu>
menu的item有一个app:actionProviderClass属性,用这个属性就可以自定义在这里显示的内容(View),这个属性的值是一个完整的类名,如"com.wuc.store.widgets.BadgeActionProvider”。
在代码中使用自定义menu
private BadgeActionProvider mBadgeActionProvider;
private void initToolBar() {
//ToolBar 初始化 menu
mToolBar.inflateMenu(R.menu.toolbar_menu);
MenuItem menuItem = mToolBar.getMenu().findItem(R.id.action_download);
mBadgeActionProvider = (BadgeActionProvider) MenuItemCompat.getActionProvider(menuItem);
mBadgeActionProvider.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtils.showShort("下载管理");
}
});
}