Actionbar&Toolbar 自定义Menu 布局--ActionProvider的使用

一般情况

多数时menu都是使用一张图片作为一个menu item,少数时候menu用文字,所以绝大多数时候,android:title、android:icon就能满足需求。

特殊情况

要求menu是一个可以动态控制的item,可以动态更新,布局也不止是一张图片一个string那么简单,如下图中红色框中的menu item所示,购物车的icon上悬浮数量,数量动态变化

这里写图片描述

除此之外还要求可以逻辑处理可以复用

这样的时候,就必须用到ActionProvider了。

Api解释

与操作视窗类似,操作提供器(由ActionProvider类定义的)用一个定制的布局代替一个操作项目,它还需要对所有这些项目行为的控制。当你在操作栏中给一个菜单项声明一个操作项目时,它不仅要一个定制的布局来控制这个菜单项的外观,而且当它在显示在溢出菜单中时,还要处理它的默认事件。无论是在操作栏中还是在溢出菜单中,它都能够提供一个子菜单。

当你想要创建一个有动态行为和在溢出菜单中有默认图标的操作视窗时,,继承ActionProvider类来定义这些行为是一个比好的的方案。创建自己的操作提供器,提供一个有组织的可重用的组件,而不是在Fragment或Activity的代码中处理各种操作项的变换和行为。
要创建自己的操作提供器,只需简单的继承ActionProvider类,并且实现合适的回调方法

demo

首先在menu属性中使用android:actionProviderClass,指定你重写的ActionProvider
actionProviderClass是support包中的属性,所以需要考虑到兼容版本的问题,使用res-auto来解决这个问题

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/cart"
        android:title="购物车"
      app:actionProviderClass="xxx.CartActionProvider"
        app:showAsAction="always" />
menu>

CartActionProvider

xml



<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingRight="10dp"
    >

    <ImageView
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:src="@drawable/icon_cart"
        />
    <TextView
        android:layout_width="15dp"
        android:layout_height="15dp"
        android:background="@drawable/red_round_bg"
        android:textColor="@color/common_white"
        android:text="13"
        android:textSize="12sp"
        android:gravity="center"
        />

FrameLayout>

class

public class CartActionProvider extends ActionProvider {

    private Context mContext;

    public CartActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view =inflater.inflate(R.layout.menu_cart, null);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             //todo
            }
        });
        return view;
    }
}

Activity中使用ActionProvider

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.cart_menu, menu);
        MenuItem item = menu.findItem(R.id.cart);
        CartActionProvider cartActionProvider = (CartActionProvider)    MenuItemCompat.getActionProvider(item);
        cartActionProvider.setData()
        super.onCreateOptionsMenu(menu, inflater);
    }

效果图

这里写图片描述

并且点击这个menu item的所有逻辑处理都在CartActionProvider中实现。

你可能感兴趣的:(android)