一般情况

多数时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

<?xml version="1.0" encoding="utf-8"?><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中实现。

更多相关文章

  1. android笔记-android基本操作和数据存储
  2. Android中使用4种方式实现按钮点击操作
  3. 使用WIFI连接android进行调试和adb操作
  4. 可视化操作Android的SQLite数据库
  5. Android(安卓)- Activity的启动模式
  6. 知识普及:Android手机操作系统构架
  7. Android(安卓)BLE基础框架使用详解
  8. Android(安卓)App开发基础篇—实现非阻塞Socket通信
  9. Android(安卓)HAL分析报告

随机推荐

  1. Android(安卓)程序分析环境搭建-静态分析
  2. Android(安卓)EventBus3.1.1从使用到源码
  3. Android中常用shell命令详解
  4. android之socket编程实例一
  5. android hal层 c 堆栈打印方法
  6. Android(安卓)设备 USB 通用调试驱动的安
  7. Android简单实现仿微信选择图片以及拍照(P
  8. Handler发送消息后消息队列的处理
  9. Jenkins奇技淫巧 — 环境配置篇(Android
  10. Android(安卓)Netd介绍