Android_Menu常用菜单详解

1.menu概述

(1).Options menu

开发应用版本在 Android 2.3.x (API level 10) 及以下版本顺利运行,如果用户点击了menu按钮则该选项菜单将显示在手机品目的底端,如果菜单条目超过6个,将多余的可能溢出的item条目封装在more条目中。

(2).Action bar

开发应用在Android 3.0 (API level 11) 及以上版本,item主要包含一些重要的动作,在<item>标签中定义了android:showAsAction="ifRoom",将可能出现在Action Bar位置右边

(3).Context menu

开发应用版本在 Android 2.3.x (API level 10) 及以下版本顺利运行,上下文菜单常用于ListView,GridView或者view集合中,当用户长按一个view对象时,该menu显示,类似于对话框。

(4).Contextual action mode

开发应用在Android 3.0 (API level 11) 及以上版本,该模式实现了ActionMode,展现在屏幕的顶端,类似ActionBar

(5).Popup menu

点击按钮弹出一个菜单

2.Menu xml文件定义

android提供了一种标准的menu xml文件定义格式化,而不是在应用代码中定义。通过menu加载器将res/menu/下的 menu xml资源文件加载进activity或fragment.下面列举的是menu xml文件中,主要的元素标签

(1).<menu>

该menu标签为menu xml文件的根节点元素标签,是menu items的容器,里面可容纳一个或者多个<item>和<group>标签

(2).<item>

代表了菜单中一个具体的菜单条目,该条目可对应一个具体的操作信息,或者展开内部包含的子菜单信息(在item标签内部定义menu标签)

(3).<group>

可选标签,其左右是方便操作该group中的所有子item标签属性,比如group下的所有item隐藏,不可操作或者不可选中

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

    <!-- 将group标签中的item封装为一组,可方便操作 -->
    <group android:id="@+id/group">
        <item
            android:id="@+id/dell"
            android:showAsAction="ifRoom|withText"
            android:title="Delete"/>
        <item
            android:id="@+id/share"
            android:showAsAction="ifRoom|withText"
            android:title="Share"/>
    </group>
 
    <!-- more中包含子菜单 -->
    <item
        android:id="@+id/more"
        android:showAsAction="ifRoom|withText"
        android:title="more...">
        <menu>
            <item
                android:id="@+id/del"
                android:icon="@android:drawable/ic_menu_delete"
                android:showAsAction="ifRoom|withText"
                android:title="Delete"/>
            <item
                android:id="@+id/share"
                android:icon="@android:drawable/ic_menu_share"
                android:showAsAction="ifRoom|withText"
                android:title="Share"/>
        </menu>
    </item>
</menu>

 

3.Options menu与Action bar

在开发选项按钮时,在高版本开发的ActionBar,在低版本上也可以以不同方式展现,后面博文将重点讲解ActionBar

class OptionMenuTest extends Activity{
	
	//	1.实现onCreateOptionsMenu方法
	public boolean onCreateOptionsMenu(Menu menu) {
		//用menu加载器将menu xml文件加载进来
		this.getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	//	2.为该选项菜单增加选择事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		//得到子菜单id
		switch (item.getItemId()) {
		case R.id.bt:
			Toast.makeText(this, "设置", 0).show();
			return true;
		default:
			break;
		}
		return false;
	}
}

4.Contextual Menus

上下文菜单常见作用于ListView, GridView对象

public class ContextMenuTest extends Activity {
	private List<String> list;
	private ListView listView;
	private Button button;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/*
		 * 1.在Activity的onCreate方法区,注册上下文菜单,需要指定view对象 该步对知道
		 * 的view对象(listView)设定了OnCreateContextMenuListener监听器
		 */
		registerForContextMenu(listView);
	}

	/*
	 * 2.在onCreateContextMenu方法中,将menu布局通过MenuInlater加载进来
	 */
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		MenuInflater inflater = getMenuInflater(); // 得到menu加载器
		inflater.inflate(R.menu.w, menu); // 将指定的布局加载
	}

	/*
	 * 3.捕获Context菜单的事件,可以执行相应的操作
	 */
	public boolean onContextItemSelected(MenuItem item) {
		// 通过菜单信息,可以得到用户长按的listView等item条目信息
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
				.getMenuInfo();
		switch (item.getItemId()) {
		case R.id.title1:
			Toast.makeText(this, "Delete:" + item.toString(), 1).show();
			return true;
		case R.id.title2:
			// 特殊:下面这个例子中的listView每个条目只有一条,可以简单当做TextView文本
			((TextView) info.targetView).setText(new Date()
					.toLocaleString());
			// 通过 info.id 可以得到用户点击listView的id
			list.set((int) info.id, new Date().toLocaleString());
			return true;
		default:
			return super.onContextItemSelected(item);
		}
	}
}

5.Popup Menu

弹出菜单

public class PopupMenuTest extends Activity {
	private List<String> list;
	private ListView listView;
	private Button button;
	private boolean flag;

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

		button = (Button) findViewById(R.id.bt);
		// 1.创建popupMenu对象
		final PopupMenu popupMenu = new PopupMenu(this, button); // 第二个参数anchor,指该popupmenu围绕anchor
		MenuInflater inflater = popupMenu.getMenuInflater(); // 得到MenuInflater加载器
		inflater.inflate(R.menu.w, popupMenu.getMenu()); // 加载menu对象

		// 2.设定点击事件,当用户点击该按钮后,显示该menu对象
		button.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				popupMenu.show(); // 显示popupmenu对象
			}
		});

		// 3.设定menu的点击事件(可以执行相应的操作)
		popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {

			@Override
			public boolean onMenuItemClick(MenuItem item) {
				// 对于一些item
				// 在<group>标签容器中,可以指定设点该group标签下的item是否可见,可编辑,可选中等多种设置
				// popupMenu.getMenu().setGroupVisible(R.id.a, flag);
				// //设置group内容是否可见
				// popupMenu.getMenu().setGroupEnabled(R.id.a, flag);
				// //设置group内容是否操作
				// popupMenu.getMenu().setGroupCheckable(R.id.a,
				// flag);//设置group内容是否选中

				// 在menu中,得到用户点击的item项
				switch (item.getItemId()) {
				case R.id.title1:
					Toast.makeText(MainActivity.this, "Delete", 1).show();
					return true;
				case R.id.title2:
					Toast.makeText(MainActivity.this, "Edit", 1).show();
					return true;
				}
				return false;
			}
		});
		// 设定当前popupmenu消失时,相应的OnDismissListener事件
		popupMenu.setOnDismissListener(new OnDismissListener() {
			@Override
			public void onDismiss(PopupMenu menu) {
				Toast.makeText(MainActivity.this, "消失", 1).show();
			}
		});
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值