ActionBar(16)自定义操作提供器ActionProvider之返回ActionView

1.代码

package com.e.acationbar;

import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.ActionProvider;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.view.View;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

public class CustomActionProviderWithActionView extends ActionProvider implements
        OnClickListener, OnTouchListener, OnKeyListener {

    private final Context context;// 上下文
    private View actionView;//action view

    private PopupWindow mPopupWindow;//popup window 里有个view,view显示的像个menu
    private View mMenu;                //popup window 里的显示控件

    private void initPopupMenu(){

        LayoutInflater lif = LayoutInflater.from(context);

        mMenu = lif.inflate(R.layout.popup_window_menu, null);
        mMenu.setAlpha(1.0f);//内部view的透明度
        //不用setBackgroundDrawable的时候必须加这句才能back键和menu键退出
//        mMenu.setFocusableInTouchMode(true);
//        mMenu.setOnKeyListener(this);
//        mMenu.setOnTouchListener(this);

        mPopupWindow = new PopupWindow(mMenu,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT);

        /*
         * setBackgroundDrawable很重要,没有这个函数 back键和menu键关闭popwindow 很麻烦,
         * 有了它以后,就不用为popwindow内的控件分别设置setOnKeyListener和setOnTouchListener了
         * 可以同时支持back返回和点popwindow外面关闭popwindow,
         */
        //0x7f0f0f0f = argb
        mPopupWindow.setBackgroundDrawable(new ColorDrawable(0xff0f0f0f));//0xff不透明
        //bg为透明的图片
        //mPopupWindow.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.bg));

        mPopupWindow.setFocusable(true);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setAnimationStyle(R.anim.popwindow_anim);

        mMenu.findViewById(R.id.imgBtn_in_popup_window).setOnClickListener(this);
        mMenu.findViewById(R.id.btn1_popup_window).setOnClickListener(this);
        mMenu.findViewById(R.id.btn2_popup_window).setOnClickListener(this);
        mMenu.findViewById(R.id.btn3_popup_window).setOnClickListener(this);
        mMenu.findViewById(R.id.btn4_popup_window).setOnClickListener(this);
        mMenu.findViewById(R.id.btnClose_popup_window).setOnClickListener(this);

    }
    public CustomActionProviderWithActionView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        this.context = context;
    }

    /**
     * @return 需要返回null, 才能弹出子菜单.否则在actiobar上显示该view
     */
    @Override
    public View onCreateActionView() {
        // TODO Auto-generated method stub
        LayoutInflater lif = LayoutInflater.from(context);

        actionView = lif.inflate(R.layout.provider_with_av, null);

        ImageView button = (ImageView) actionView
                .findViewById(R.id.btn_action_view_for_costomProvider);

        button.setOnClickListener(this);

        initPopupMenu();

        return actionView;// 不return null不显示子菜单
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.btn_action_view_for_costomProvider: {
            mPopupWindow.showAsDropDown(v,-20,10);
        }
            return;
        case R.id.imgBtn_in_popup_window:
            Toast.makeText(context, "popup window image button clicked",
                    Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn4_popup_window:
        case R.id.btn3_popup_window:
        case R.id.btn2_popup_window:
        case R.id.btn1_popup_window:
            Toast.makeText(context, "popup window item clicked",
                    Toast.LENGTH_SHORT).show();
            break;
        case R.id.btnClose_popup_window:
            break;
        }
        mPopupWindow.dismiss();

    }
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
        case KeyEvent.KEYCODE_MENU:
            if (mPopupWindow != null && mPopupWindow.isShowing()) {
                mPopupWindow.dismiss();
            }
            break;
        }
        return true;
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        mPopupWindow.dismiss();
        return false;
    }
}

2.本provider在主菜单中的配置

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.e.acationbar.MainActivity" >

    <item
        android:id="@+id/action_customProvider_no_actionView"
        android:actionProviderClass="com.e.acationbar.CustomActionProviderNoActionView"
        android:icon="@drawable/actionbar_setting_icon"
        android:showAsAction="always"
        android:title="@string/custom_provider_no_av">
    </item>
    <item
        android:id="@+id/action_customProvider_with_actionView"
        android:actionProviderClass="com.e.acationbar.CustomActionProviderWithActionView"
        android:icon="@drawable/ic_jog_dial_answer_and_hold"
        android:showAsAction="always"
        android:title="@string/custom_provider_av">
    </item>
...
</menu>

3.provider 的actionView的布局文件  provider_with_av.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ImageView
        android:id="@+id/btn_action_view_for_costomProvider"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/selector_img_view_bg" />

</LinearLayout>

4.popup window的view布局文件(模拟菜单):popup_window_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/LinearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center" >

        <ImageButton
            android:id="@+id/imgBtn_in_popup_window"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_jog_dial_decline" />

        <Button
            android:id="@+id/btn4_popup_window"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/item" />
    </LinearLayout>

    <Button
        android:id="@+id/btn3_popup_window"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/item" />

    <Button
        android:id="@+id/btn2_popup_window"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/item" />

    <Button
        android:id="@+id/btn1_popup_window"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/item" />

    <Button
        android:id="@+id/btnClose_popup_window"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="close" />

</LinearLayout>
时间: 2024-07-29 22:32:02

ActionBar(16)自定义操作提供器ActionProvider之返回ActionView的相关文章

ActionBar(15)自定义操作提供器ActionProvider之返回空ActionView

1.类代码 package com.e.acationbar; import android.content.Context; import android.view.ActionProvider; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.SubMenu; imp

Android学习笔记(二十)——自定义内容提供器

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 如果我们想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentProvider 的方式来创建一个自己的内容提供器: 一.继承ContentProvider的六个方法: ContentProvider 类中有六个抽象方法,我们需要使用子类去继承它,并重写六个方法,我们先来认识这六个类.新建 MyProvider继承自 ContentProvide,代码如下所示: 1 p

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

一般情况 多数时menu都是使用一张图片作为一个menu item,少数时候menu用文字,所以绝大多数时候,android:title.android:icon就能满足需求. 特殊情况 要求menu是一个可以动态控制的item,可以动态更新,布局也不止是一张图片一个string那么简单,如下图中红色框中的menu item所示,购物车的icon上悬浮数量,数量动态变化 除此之外还要求可以逻辑处理可以复用 这样的时候,就必须用到ActionProvider了. Api解释 与操作视窗类似,操作提

【练习】内容提供器二、创建自己的内容提供器并测试

1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不同的软件之间数据共享,提供统一的接口.也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件.数据库内存储的信息.当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Andro

《ASP.NET MVC 4 实战》学习笔记 11:模型绑定器与值提供器

一.创建自定义模型绑定器: 利用请求数据塑造模型对象并将对象传递给动作参数的过程称为模型绑定(Model Binding). 大多数时候动作参数是对象的主键或其他唯一标识符,因此我们可以不必在所有的动作中都放置一段重复的数据访问代码(下面代码“\\Before”部分),而是使用一个自定义的模型绑定器(下面代码“\\After”部分).它能够在动作执行之前加载存储对象,于是动作不再以唯一标识符而是以持久化的对象类型作为参数. // Before public ViewResult Edit (Gu

android--创建自己的内容提供器

想要实现跨程序共享数据需要用到内容提供器,内容提供器给别的应用提供了访问接口,可以新建一个类去继承ContentProvider来创建一个自己的内容提供器.ContentProvider类中有6种抽象方法,在使用子类继承的时候需要全部重写. 1 public class Myprovider extends ContentProvider { 2 3 @Override 4 /* 5 初始化时调用 6 通常会在这里完成对数据库的创建和升级等操作,返回true表示初始化成功. 7 只有当存在Con

SQLHelper——一个自定义SQL帮助器

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Data.SqlClient; 7 using System.Data; 8 9 /// <summary> 10 /// 名称: 11 /// 自定义SQL帮助器 12 /// 摘要: 13 /// 提供简化sql操作

动作视图和动作提供器(Action Views and Action Providers)

首先承认:这篇文章翻译的有点不准确,因为这个action,我拿不准怎么翻译,不知道是翻译成动词还是名词.所以我把有道词典上的翻译结果列在下面. action n. 行动:活动:功能:战斗:情节 开始翻译 v7 appcompat 支持库为你的应用提供了几种和用户的交互方式.前面的几节课讲解了如何定义一个action(讲的并不怎么明白)可以是一个按钮或者一个菜单项.这节课讲解如何添加另外两种通用的组件. 应用栏上的动作视图有很多功能.例如,一个搜索动作视图可以让用户在应用栏上输入搜索文字,而不用改

Android内容提供器——创建自己的内容提供器

创建自己的内容提供器很简单,只需要新建一个类继承ContentProvider类,并重写其中的6个抽象方法即可.(需要全部重写) 一 URI的写法 一个标准的内容URI写法有两种: 1.路径结尾,表示访问表中所有内容: content://com.example.app.provider/table1 // * 可以代表任意长度的任意字符,所以也可以写成下面这样 content://com.example.app.provider/* 2.id结尾,表示访问表中特定id的内容: content: