Actionbar实现子菜单的几种方式

第一种方式是使用ActionProvider。定义一个如下代码的ActionBar

public class PopupMenuActionProvider extends ActionProvider {

    public PopupMenuActionProvider(Context context) {
        super(context);
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        subMenu.add(0, 0, 0, "Sub1");
        subMenu.add(0, 1, 1, "Sub2");
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }
}

然后在activity的menu.xml中item的android:actionProviderClass使用该PopupMenuActionProvider即可。

第二种方式仍然是使用ActionProvider,不过此时是不使用onPrepareSubMenu,而是直接在onCreateActionView中定义。拷贝自别人的blog

public class MyActionProvider extends ActionProvider{
    private ContextWrapper mContextWrapper;
    private OnMenuItemClickListener mOnMenuItemClickListener;

    public MyActionProvider(Context context) {
        super(context);
        mContextWrapper = (ContextWrapper)context;
    }

    @Override
    public View onCreateActionView() {
        LayoutInflater layoutInflater = LayoutInflater.from(mContextWrapper);
        View view = layoutInflater.inflate(R.layout.my_action_provider, null);
        ImageView popupView = (ImageView)view.findViewById(R.id.popup_view);
        popupView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPopup(v);
            }
        });
        mOnMenuItemClickListener = new OnMenuItemClickListener() {
            private String TAG = "mOnMenuItemClickListener";

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()) {
                case R.id.Settings1:
                    Log.v(TAG , "Settings1");
                    break;
                case R.id.Settings2:
                    Log.v(TAG , "Settings2");
                    break;

                default:
                    break;
                }
                return false;
            }
        };
        return view;
    }

    private void showPopup(View v) {
        PopupMenu popup = new PopupMenu(mContextWrapper, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.popmenu, popup.getMenu());
        popup.setOnMenuItemClickListener(mOnMenuItemClickListener);
        popup.show();
    }

}

这里是在layout中定义一个imageview,然后在onclick的时候现实一个PopupMenu。

第三种方式是在activty/fragment的onOptionsItemSelected响应对一个item的点击,然后创建popupmenu。好处是比第二种方式不用多创建一个类,坏处是代码偶耦合在activity/fragment中。

以上两种方式是子菜单的表现方式,后面的是使用spinner这种类似于子菜单的方式。

第四种方法是使用ActionBar.SetNavigationMode(NAVIGATION_MODE_LIST)。这其实是利用了ActionBar本身可以使用spinner这种drop down list来切换的功能。参考Android actionbar 文档

第五种方法是自己指定一个item的类为spinner,例如定义menu.xml为

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

    <item
        android:id="@+id/action_spinner"
        android:actionViewClass="android.widget.Spinner"        android:orderInCategory="1"
        android:showAsAction="always"/>
</menu>

然后在代码中添加spinner的内容。

第六种方式类似,只是不使用android:actionViewClass而是使用android:actionLayout,在layout.xml中指定使用spinner。

总结下,其实这些方式利用了actionbar的几个功能:

  • 设置NavigationMode为mode_list来利用actionbar自带的spinner形式的droplist。
  • 设置actionview为spinner或其他view
  • 使用actionprovider来进一步完全掌控一个menu item的具体行为。
时间: 2024-08-02 22:26:49

Actionbar实现子菜单的几种方式的相关文章

【转】android创建Popwindow弹出菜单的两种方式

方法一的Activity [java] view plaincopy package com.app.test02; import android.app.Activity; import android.os.Bundle; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import

iReport+jasperreport创建子表的几种方式(1)

在制作报表的过程中,子表是必不可少的,今天就研究了一下制作子表的几种方式 一.连接数据库创建子表 以MySQL为例: 1)iReport 创建父表 这个就是创建一个新的表格,不过记得数据源要选择mySQL ,其他的数据库数据源也一样的. 2)创建好之后,我们来创建子表,在组件面板找到拖动到父表当中的任意一个地方,我是放到detail里面的 它会产生一个向导 一路next下去,只是在最后一项选择use empty datasource,不过选其他的也行,待会我们还要修改 3)说一下原理:这种方式就

iOS 获取Interface Builder上的子控制器的两种方式

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 准备工作 Storyboard上为一个ViewController拖拽两个子控制器,并且设置两个segue的identifier分别为childvc1,childvc2 效果 方式一,根据segue的identifier来判断获得 #import "ViewController.h" #import "ChildViewController1.h" #import "ChildV

用纯css实现下拉菜单的几种方式

第一种:display:none和display:block切换 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 ul{ 8 list-style: none; 9 } 10 .nav>li{ 11 float

Html5+Css3制作下拉菜单的三种方式

一.渐变式改变ol的高度 1.外部为ul标签,在每个li里嵌套一个ol列表2.设置外部li左浮动,内部ol标签绝对定位,外部li标签相对定位3.设置ol的高为0,溢出隐藏4.外部li标签:hover 时,设置ol的高度,transition渐变 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>&l

用三种方式实现导航菜单中的二级下拉菜单

如何实现导航菜单栏中的二级下拉菜单? 我们在淘宝.搜狐等大型网站上都可以看到使用的一些二级下拉菜单,比如下面这张图片. 但是如何实现类似的图片呢?实际上,我们有至少三种方式来实现,下面,我附上代码供大家参考. 1.仅使用html和css <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</tit

android菜单创建的两种方式和菜单项添加图标

    菜单创建的两种方式:     1.在xml文件中创建菜单: 具体代码: <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.xunfang.menucreate.MainActivity" > //此处创建子菜单 <

三种方式实现下拉菜单效果

使用3种方式实现下拉菜单效果: html/css .js方法实现下拉菜单显示隐藏.jquery方法实现下拉菜单显示隐藏 先看效果图 第一种:html/css方式实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>下拉菜单的实现</title> <style type="text/css"> *{margin

HTML中实现子容器垂直居中的几种方式

年前前端圈蛮热闹的,大家撕的挺欢的,阿当想说的并不是固步自封,抵制学习新东西,而是想说要夯实基础,然后对框架有甄别能力的基础上再去有选择的学习.归根结底还是要掌握好根本,也就是道,其余的工具都不过是术,得道了,术这些东西自然手到擒来.好了,胡扯打住.阿当说区别真前端和伪前端其中一点就是能说出几种HTML元素的垂直居中方式. 那我在这里总结一下我get的几种方式. 代码结构如下,父容器,子容器宽高不确定. <div class="parent"> <div class=