Android Composite(Menu)详解

目录:
    1.Menu概述
    2.Menu的一些常用属性
    3.Menu分类
        3.1 选项菜单(Option Menu)
        3.2 上下文菜单(Context Menu)
        3.3 弹出菜单(Popup Menu)
        3.4 子菜单(Sub Menu)
        
1.Menu概述
    Menu的样子和作用我想没有必要在说,通常我们在使用App的过程中都有见过它,有从底部弹出的,长按弹出的等等,不过底部弹出
菜单有被Actionbar overflow替换的趋势,因为底部菜单的调用需要设备硬件盘的Menu按键来调用,而在设备更迭中大多数设备已经弃掉
了硬件盘的Menu按键。

2.Menu的一些常用属性

    android:title="":设置菜单项的title
    android:icon="":设置菜单项的icon
    android:alphabeticShortcut="":字母快捷键
    android:numericShortcut="":数字快捷键
    android:checked="":设置菜单项是否被选中
    android:checkable="":设置菜单项是否能选中
    android:enabled="":设置菜单项是否可用
    android:visible="":设置菜单项是否见
    android:orderInCategory="1":设置菜单项顺序
    android:showAsAction="always|ifRoom|withText|never":设置菜单项在anctionbar中是否放入overflow

3.Menu分类
    3.1 选项菜单(Option Menu)
1)概述
    选项菜单有被Actionbar overflow替代的趋势,他的调用主要是通过物理键盘的Menu键去调用,通常从设备的底部弹出,选项主要
是一些全局的操作。

2)Option menu代码实现(该方法不符合逻辑代码与UI显示的低耦合,让我们的代码特别的臃肿,所以不推荐使用)

    package com.example.menu;

    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        /*
        * 创建选项菜单
        * */
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            /*参数:
             *   1、组别:如果不分组的话就写Menu.NONE,
             *
             *   2、Id: Android根据这个Id来确定不同的菜单
             *
             *   3、顺序:那个菜单现在在前面由这个参数的大小决定
             *
             *   4、文本: 菜单的显示文本
             */

            menu.add(Menu.NONE, Menu.FIRST + 1, 1, "删除").setIcon(

                    android.R.drawable.ic_menu_delete);

            menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(

                    android.R.drawable.ic_menu_edit);

            menu.add(Menu.NONE, Menu.FIRST + 3, 3, "帮助").setIcon(

                    android.R.drawable.ic_menu_help);

            menu.add(Menu.NONE, Menu.FIRST + 4, 4, "添加").setIcon(

                    android.R.drawable.ic_menu_add);

            menu.add(Menu.NONE, Menu.FIRST + 5, 5, "详细").setIcon(

                    android.R.drawable.ic_menu_info_details);

            menu.add(Menu.NONE, Menu.FIRST + 6, 6, "发送").setIcon(

                    android.R.drawable.ic_menu_send);

            return true;

        }

        /*
        * 选项选择监听
        * */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case Menu.FIRST+1:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+2:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+3:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+4:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+5:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
                case Menu.FIRST+6:
                    Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    }


3)Option menu xml实现(直观便于修改管理,推荐使用此方法创建)
   (3.1)MainActivity.java
    package com.example.menu;

    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.Toolbar;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.Toast;

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }

        public boolean onCreateOptionsMenu(Menu menu) {

            //通过xml定义的menu
            getMenuInflater().inflate(R.menu.option_menu,menu);
            //返回true设置的菜单才会生效,这里super.onCreateOptionsMenu(menu)调用父类方法返回true
            return true;
        }
        /*
        * 选项选择监听
        * */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
            return super.onOptionsItemSelected(item);
        }

    }
   
    (3.2)option_menu.xml
  
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!--
    android:title="":设置菜单项的title
    android:icon="":设置菜单项的icon
    android:alphabeticShortcut="":字母快捷键
    android:numericShortcut="":数字快捷键
    android:checked="":设置菜单项是否被选中
    android:checkable="":设置菜单项是否能选中
    android:enabled="":设置菜单项是否可用
    android:visible="":设置菜单项是否见
    android:orderInCategory="1":设置菜单项顺序
    android:showAsAction="always|ifRoom|withText|never":设置菜单项在anctionbar中是否放入overflow
    -->
    <item android:id="@+id/delete"
        android:icon="@android:drawable/ic_input_delete"
        android:orderInCategory="1"
        android:title="删除"
        />
    <item android:id="@+id/save"
        android:icon="@android:drawable/ic_menu_edit"
        android:orderInCategory="3"
        android:title="保存"/>
    <item android:id="@+id/help"
        android:icon="@android:drawable/ic_menu_help"
        android:orderInCategory="2"
        android:title="帮助"/>
    <item android:id="@+id/send"
        android:icon="@android:drawable/ic_menu_send"
        android:orderInCategory="4"
        android:title="发送"/>
</menu>

4)效果截图

    3.2 上下文菜单(Context Menu)
1)概述:
    上下文菜单通常在UI中对某些特点资源执行一些操作,比如:删除、置顶、复制、收藏等等,都可以通过上下文菜单作为显示注册
到某个控件上,同时Context Menu通常通过长点击某个控件调出。

2)简单使用
    (2.1)COntextMenuActivity.java
package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by elimy on 2016-09-01.
 */
public class ContextMenuActivity extends AppCompatActivity {
    ArrayList<String> arrayList = new ArrayList<String>();
    ArrayAdapter adapter;
    ListView listView ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.context_menu_activity);
        //初始化listview
        listView = (ListView) findViewById(R.id.context_menu_lv);
        //初始化数组
        for (int i=0;i<10;i++){
            arrayList.add("数据"+i);
        }
        //初始化adapter
        adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,android.R.id.text1,arrayList);
        //设置适配器
        listView.setAdapter(adapter);
        //注册上下文菜单
        registerForContextMenu(listView);

    }
    /*
    * 创建选项菜单方法
    * */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //声明并初始化menu布局加载器
        MenuInflater  inflater= getMenuInflater();
        //适配加载定义的menu xml
        inflater.inflate(R.menu.context_menu,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        Toast.makeText(ContextMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
        return super.onContextItemSelected(item);
    }
}

       
    (2.2)context_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/delete"
        android:icon="@android:drawable/ic_input_delete"
        android:orderInCategory="1"
        android:title="删除"
        />
    <item android:id="@+id/save"
        android:icon="@android:drawable/ic_menu_edit"
        android:orderInCategory="3"
        android:title="保存"/>
    <item android:id="@+id/help"
        android:icon="@android:drawable/ic_menu_help"
        android:orderInCategory="2"
        android:title="帮助"/>
    <item android:id="@+id/send"
        android:icon="@android:drawable/ic_menu_send"
        android:orderInCategory="4"
        android:title="发送"/>
</menu>

   
    (2.3)context_menu_activity.java
    
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/context_menu_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>  
   
    (2.4)效果截图

3.3 弹出菜单(Popup Menu)

1)概述:
    Popup Menu与Popup window类似,他需要依附于某个View之上,通常menu显示于View下方。
    
2)Actionbar通过Popup menu实现弹出菜单,与overflow菜单类似
    (2.1)隐藏Actionbar,准备使用toolbar
    
        <activity android:name=".PopMenuActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>   
  
    (2.2)主布局文件popup_menu_activity.xml
    
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
  <android.support.v7.widget.Toolbar
      android:id="@+id/toolbar"
      android:layout_width="match_parent"
      android:background="@color/colorAccent"
      android:layout_height="?actionBarSize">
    <ImageView
        android:layout_marginLeft="160dp"
        android:id="@+id/menu_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/expand_more_24"/>
  </android.support.v7.widget.Toolbar>
</RelativeLayout>    


    
    (2.3)菜单项布局文件popup_menu.xml
   
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:context=".SecondActivity">

    <!--查询按钮-->
    <item android:id="@+id/action_serach"
        android:title="搜索"
        android:orderInCategory="1"
        android:icon="@drawable/search_24"
        />
    <!--分享-->
    <item android:id="@+id/action_share"
        android:title="分享"
        android:orderInCategory="2"
        android:icon="@drawable/share_24"
        />
    <!--设置-->
    <item android:id="@+id/action_setting"
        android:title="设置"
        android:orderInCategory="3"
        android:icon="@drawable/rating"
        />
</menu>    

    
    (2.4)主布局java类PopMenuActivity.java    
 
package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.internal.view.menu.MenuBuilder;
import android.support.v7.internal.view.menu.MenuPopupHelper;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by elimy on 2016-09-01.
 */
public class PopMenuActivity extends AppCompatActivity {
    PopupMenu popupMenu;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pop_menu_activity);
        //声明并初始化
        final ImageView imageView = (ImageView) findViewById(R.id.menu_iv);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        //toolbar设置标题
        toolbar.setTitle("弹出自定义菜单");
        //设置title颜色
        toolbar.setTitleTextAppearance(PopMenuActivity.this,R.style.Theme_Toolbar_Title);
        //设置显示toolbar
        setSupportActionBar(toolbar);
        //为图片设置监听
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //初始化PopupMenu
                popupMenu = new PopupMenu(PopMenuActivity.this,imageView);
                //通过menu布局加载器适配菜单
                getMenuInflater().inflate(R.menu.pop_menu,popupMenu.getMenu());
                try {
                    //通过反射获取PopupMenu类的mPopup成员变量
                    Field field = popupMenu.getClass().getDeclaredField("mPopup");
                    //设置为可接近,可访问,因为mPopup在PopupMenu类中为私有属性
                    field.setAccessible(true);
                    //通过属性get方法获取属性的类MenuPopupHelper的类对象
                    MenuPopupHelper menuPopupHelper = (MenuPopupHelper) field.get(popupMenu);
                    //设置强制显示icon
                    menuPopupHelper.setForceShowIcon(true);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                //显示popupMenu
                popupMenu.show();
                //设置监听器
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(PopMenuActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();
                        return false;
                    }
                });
            }
        });
    }
}  

   
    (2.5)效果截图

3.4 子菜单(Sub Menu)
    
1)概述:
    子菜单即菜单项下的菜单,比如某个操作的子操作有很多,像文件操作,子操作有文件新建,复制,剪切等等
    
2)简单使用
    package com.example.menu;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;

/**
 * Created by elimy on 2016-09-02.
 */
public class SubMenuActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub_menu_activity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        SubMenu share =menu.addSubMenu("分享");
        SubMenu edit = menu.addSubMenu("编辑");
        SubMenu file = menu.addSubMenu("文件");
        share.add(0,Menu.FIRST,1,"分享到微信");
        share.add(0,Menu.FIRST+1,2,"分享到微博");
        //去掉子菜单头部
        //share.clearHeader();
        //设置父选项图标,需要强制显示才能看到
        //share.setIcon(R.drawable.share_24);
        //设置子选项头部显示图标
        //share.setHeaderIcon(R.drawable.share_24);
        edit.add(0,Menu.FIRST+2,0,"复制");
        edit.add(0,Menu.FIRST+3,1,"剪切");
        file.add(0,Menu.FIRST+4,1,"打开");
        file.add(0,Menu.FIRST+5,2,"新建");

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case Menu.FIRST:
                Toast.makeText(SubMenuActivity.this,"点击了分享到微信",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+1:
                Toast.makeText(SubMenuActivity.this,"点击了分享到微博",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+2:
                Toast.makeText(SubMenuActivity.this,"点击了复制",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+3:
                Toast.makeText(SubMenuActivity.this,"点击了剪切",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+4:
                Toast.makeText(SubMenuActivity.this,"点击了打开",Toast.LENGTH_SHORT).show();
                break;
            case Menu.FIRST+5:
                Toast.makeText(SubMenuActivity.this,"点击了新建",Toast.LENGTH_SHORT).show();
                break;

        }
        return true;
    }
}



    推荐文章:
            http://blog.youkuaiyun.com/wlwlwlwl015/article/details/42170771
             http://blog.youkuaiyun.com/books1958/article/details/44343001
             http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值