android UI小结(六)

一、选项菜单和子菜单
菜单资源文件一般放在/res/menu目录下,菜单资源的根元素通常是<menu />,<menu />,元素无需指定任何属性,它可以包含子元素:
<item />:定义菜单项
<group />:将多个item定义的菜单包装成一个菜单组。
一般推荐使用XML文件定义菜单。
eg.定义菜单的经典例子
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:title="@string/font_size"
		android:icon="@drawable/font">
		<menu>
			<!-- 定义一组单选菜单项 -->
			<group android:checkableBehavior="single">
				<!-- 定义多个菜单项 -->
				<item
					android:id="@+id/font_10"
					android:title="@string/font_10"/>
				<item
					android:id="@+id/font_12"
					android:title="@string/font_12"/>
				<item
					android:id="@+id/font_14"
					android:title="@string/font_14"/>
				<item
					android:id="@+id/font_16"
					android:title="@string/font_16"/>
				<item
					android:id="@+id/font_18"
					android:title="@string/font_18"/>																
			</group>
		</menu>
	</item>
	<!-- 定义一个普通菜单项 -->
	<item android:id="@+id/plain_item"
		android:title="@string/plain_item">
	</item>
	<item android:title="@string/font_color"
		android:icon="@drawable/color">
		<menu>
			<!-- 定义一组允许复选的菜单项 -->
			<group>
				<!-- 定义3个菜单项 -->
				<item
					android:id="@+id/red_font"
					android:title="@string/red_title"/>
				<item
					android:id="@+id/green_font"
					android:title="@string/green_title"/>
				<item
					android:id="@+id/blue_font"
					android:title="@string/blue_title"/>						
			</group>
		</menu>
	</item>
</menu>

而菜单项被单击后回调的一般写法如下:
@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		MenuInflater inflator = new MenuInflater(this);
		// 状态R.menu.context对应的菜单,并添加到menu中
		inflator.inflate(R.menu.my_menu, menu);
		return super.onCreateOptionsMenu(menu);
	}
@Override
	// 选项菜单的菜单项被单击后的回调方法
	public boolean onOptionsItemSelected(MenuItem mi)
	{
		if(mi.isCheckable())
		{
			mi.setChecked(true);  //②
		}
		// 判断单击的是哪个菜单项,并针对性的作出响应。
		switch (mi.getItemId())
		{
			case R.id.font_10:
				txt.setTextSize(10 * 2);
				break;
			case R.id.font_12:
				txt.setTextSize(12 * 2);
				break;
			case R.id.font_14:
				txt.setTextSize(14 * 2);
				break;
			case R.id.font_16:
				txt.setTextSize(16 * 2);
				break;
			case R.id.font_18:
				txt.setTextSize(18 * 2);
				break;
			case R.id.red_font:
				txt.setTextColor(Color.RED);
				mi.setChecked(true);
				break;
			case R.id.green_font:
				txt.setTextColor(Color.GREEN);
				mi.setChecked(true);
				break;
			case R.id.blue_font:
				txt.setTextColor(Color.BLUE);
				mi.setChecked(true);
				break;
			case R.id.plain_item:
				Toast toast = Toast.makeText(MenuResTest.this, "您单击了普通菜单项",
						Toast.LENGTH_SHORT);
				toast.show();
				break;
		}
		return true;
	}


二、上下文菜单 ContextMenu
用户长按界面时会出现的菜单项称为上下文菜单。
创建上下文菜单的资源文件:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 定义一组单选菜单项目 -->
	<group android:checkableBehavior="single">
		<!-- 定义3个菜单项 -->
		<item
			android:id="@+id/red"
			android:title="@string/red_title"
			android:alphabeticShortcut="r"/>
		<item
			android:id="@+id/green"
			android:title="@string/green_title"
			android:alphabeticShortcut="g"/>
		<item
			android:id="@+id/blue"
			android:title="@string/blue_title"
			android:alphabeticShortcut="b"/>						
	</group>  
</menu>

为某一组件注册上下文菜单以及菜单项被单击后回调的方法

@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		txt = (TextView) findViewById(R.id.txt);
		// 为文本框注册上下文菜单
		registerForContextMenu(txt);
	}

// 创建上下文菜单时触发该方法
	@Override
	public void onCreateContextMenu(ContextMenu menu, View source,
			ContextMenu.ContextMenuInfo menuInfo)
	{
		MenuInflater inflator = new MenuInflater(this);
		// 状态R.menu.context对应的菜单,并添加到menu中
		inflator.inflate(R.menu.context, menu);
		menu.setHeaderIcon(R.drawable.tools);
		menu.setHeaderTitle("请选择背景色");
	}

// 上下文菜单中菜单项被单击时触发该方法。
	@Override
	public boolean onContextItemSelected(MenuItem mi)
	{
		mi.setChecked(true);  //①
		switch (mi.getItemId())
		{
			case R.id.red:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.RED);
				break;
			case R.id.green:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.GREEN);
				break;
			case R.id.blue:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.BLUE);
				break;
		}
		return true;
	}


三、PopupMenu 弹出式菜单
会在指定组件上弹出菜单项,默认情况下,PopupMenu会显示在该组件的下方或上方。
eg.创建PopupMenu并为Popup菜单的菜单项的单击事件绑定监听器
// 创建PopupMenu对象
		popup = new PopupMenu(this, button);
		// 将R.menu.popup_menu菜单资源加载到popup菜单中
		getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
		// 为popup菜单的菜单项单击事件绑定事件监听器
		popup.setOnMenuItemClickListener(
			new PopupMenu.OnMenuItemClickListener()
		{
			@Override
			public boolean onMenuItemClick(MenuItem item)
			{
				switch (item.getItemId())
				{
					case R.id.exit:
						// 隐藏该对话框
						popup.dismiss();
						break;
					default:
						// 使用Toast显示用户点击的菜单项
						Toast.makeText(PopupMenuTest.this,
							"您单击了【" + item.getTitle() + "】菜单项"
							, Toast.LENGTH_SHORT).show();
				}
				return true;
			}
		});
		popup.show();
	}

猜你喜欢

转载自raising.iteye.com/blog/2161377