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

<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中实现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 21:43:43

Actionbar&Toolbar 自定义Menu 布局--ActionProvider的使用的相关文章

自定义ActionProvider ToolBar 自定义Menu小红点

自定义ActionProvider ToolBar 自定义Menu小红点 版权声明:转载必须注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 今天的几个目标: 1. 自定义ActionProvider 2. Toolbar ActionBar自定义Menu 3. Toolbar ActionBar 右侧Menu添加角标(Toolbar ActionBar Menu添加小红点) 源代码在文章末尾. 效果预览 自定义Menu后不影响原生MD的任何效果

Android ToolBar自定义图标,关联DrawerLayout

Android5.0出现了一个可以代替ActionBar的控件ToolBar,使用更加灵活,一般我们使用ToolBar来和DrawerLayout配合使用,官方提供了一个开关类ActionBarDrawerToggle,来实现ToolBar和DrawerLayout的关联,但是 有时根据我们的需求需要更改左侧的图标,不在需要系统默认的三条杠的图标同时点击图标还想要DrawerLayout的侧拉页面出来,下面讲解两种不同的方式 一:通过代码来实现改变ToolBar的图标 public class

Android开发之Android Material Design Toolbar自定义随笔

一.自定义Toolbar的menu: 在menu下新建menu.xml文件,自定义menu的样式: 1 <menu xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:tools="http://schemas.android.com/tools" 4

Android 自定义RadioGroup布局

前段时间项目中需要这种效果,自定义RadioGroup布局,但是前提是要找到RadioButton.我搜集各种资料,尝试各种测试.终于有了自定义RadioGroup布局.自定义RadioGroup布局,里面可以包含各种布局,RadioButton也在这里面的布局.通过递归查找方法能找到RadioButton的id,还是一组的.接下来看代码. 转载请注明出处:单击此处 欢迎下载测试demo:单击此处 一.自定义CustomNestRadioGroup类. package com.example.c

ActionBar之setting+Menu+ActionMode介绍

    之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar.但是在最新的SDK中Google提供了一个AppCompat的工程作为libary.它里面就提供了向低版本兼容的ActionBar,所以我们就直接用官方的库就行了.这里需要注意的是,如果你是用最新的Eclipse with SDK自动创建的工程,那么就没有问题,如果是自己建立的工程,那么就需要设置style文件和添加一些命名空间,具体步骤请参照:http:

获取 AlertDialog自定义的布局 的控件

AlertDialog自定义的布局 效果图: 创建dialog方法的代码如下: 1 LayoutInflater inflater = getLayoutInflater(); 2 View layout = inflater.inflate(R.layout.dialog, 3 (ViewGroup) findViewById(R.id.dialog)); 4 new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout

[android] 手机卫士自定义对话框布局

手机防盗页面部分 点击手机防盗,进行判断,如果没有设置密码,显示一个设置密码的对话框,如果已经设置密码了,弹出输入密码对话框 密码保存在SharedPreferences中,数据取出进行判断 自定义一个布局文件,dialog_setup_password.xml 根布局宽度不要充满屏幕 内部控件,宽度要小一点留出空间,居中对齐,android:gravity=”center” 两个并排的按钮,确定和取消,线性布局水平朝向 获取AlertDialog.Builder对象,通过new Builder

Android自定义动态布局 — 多图片上传

Android自定义动态布局 - 多图片上传 本文介绍Android中动态布局添加图片,多图片上传. 项目中效果图:    技术点: 1.动态添加格局中的线条和添加图片的+号 2.多张图片异步上传 首先来看一下布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layo

BootStrap入门教程 (一) :手脚架Scaffolding(全局样式(Global Style),格网系统(Grid System),流式格网(Fluid grid System),自定义(Customing),布局(Layouts))

2011年,twitter的“一小撮”工程师为了提高他们内部的分析和管理能力,用业余时间为他们的产品构建了一套易用.优雅.灵活.可扩展的前端工具集--BootStrap.Bootstrap由MARK OTTO和Jacob Thornton所设计和建立,在github上开源之后,迅速成为该站上最多人watch&fork的项目.大量工程师踊跃为该项目贡献代码,社区惊人地活跃,代码版本进化非常快速,官方文档质量极其高(可以说是优雅),同时涌现了许多基于Bootstrap建设的网站:界面清新.简洁;要素