使用菜单资源
java可以实现android菜单,但是android推荐使用xml来定义菜单,使用xml更好的解耦。
一,定义 菜单资源
菜单资源放置在res/menu目录下,根元素<menu .../>,<menu .../>元素无需指定任何属性。
<menu .../>包含如下子元素:
1. <item.../> 元素:定义菜单项
2.<group.../>子元素: 将多个item定义的菜单包装成一个菜单组
<group.../>子元素由于控制整组菜单的行为,该元素可制定如下常用属性:
(1) checkableBehavior : 指定菜单的选择行为。可指定none(不可选),all(多选),single(单选) 。
(2) menuCategory :对应菜单进行分类,指定菜单的优先级
(3) visible:可见性
(4) enable:指定该菜单是否可用
<item.../>元素用于定义菜单项,<item.../>元素又可包含<menu.../>元素,位于<item.../>元素内部的<menu.../>就代表了子菜单。
<item.../>元素可指定如下常用属性,
android:id : 为菜单指定id
android:title:指定菜单项的标题
android:icon:指定菜单项的图标
android:alphabeticShortcut:为菜单项指定字符串快捷键。
android:numbericShortcut:为菜单项指定数字快捷键。
android:checked:是否已经选中
android:checkable:是否可选
android:visible:是否可见
andorid:enable:是否使能
一旦在程序中定义了菜单资源后,接下来重写onCreateOptionsMenu(用于创建选项菜单)、
onCreateContextMenu(用于创建上下文菜单)方法,在这些方法调用menuInflater对象的inflate方法装载指定资源对应的菜单即可。
二,使用菜单资源
\res\menu\my_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:title="font_size"
android:icon="@drawable/ic_launcher"
>
<menu> <!-- 定义一组单选菜单 -->
<group android:checkableBehavior="single"></group>
<item android:id="@+id/font_10" android:title="font_10"></item>
<item android:id="@+id/font_12" android:title="font_12"></item>
<item android:id="@+id/font_14" android:title="font_14"></item>
<item android:id="@+id/font_16" android:title="font_16"></item>
<item android:id="@+id/font_18" android:title="font_18"></item>
</menu>
</item>
<!-- 定义一个普通菜单项 -->
<item android:id="@+id/plain_item" android:title="plain_item"></item>
<item android:title="font_color"
android:icon="@drawable/ic_phone_24dp"
>
<menu> <!-- 定义一组单选菜单 -->
<group>
<item android:id="@+id/red_font" android:title="red_font"></item>
<item android:id="@+id/green_font" android:title="green_font"></item>
<item android:id="@+id/blue_font" android:title="blue_font"></item>
</group>
</menu>
</item>
</menu>
\res\menu\my_context.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:title="font_size"
android:icon="@drawable/ic_launcher"
>
<menu> <!-- 定义一组单选菜单 -->
<group android:checkableBehavior="single"></group>
<item android:id="@+id/font_10" android:title="font_10"></item>
<item android:id="@+id/font_12" android:title="font_12"></item>
<item android:id="@+id/font_14" android:title="font_14"></item>
<item android:id="@+id/font_16" android:title="font_16"></item>
<item android:id="@+id/font_18" android:title="font_18"></item>
</menu>
</item>
<!-- 定义一个普通菜单项 -->
<item android:id="@+id/plain_item" android:title="plain_item"></item>
<item android:title="font_color"
android:icon="@drawable/ic_phone_24dp"
>
<menu> <!-- 定义一组单选菜单 -->
<group>
<item android:id="@+id/red_font" android:title="red_font"></item>
<item android:id="@+id/green_font" android:title="green_font"></item>
<item android:id="@+id/blue_font" android:title="blue_font"></item>
</group>
</menu>
</item>
</menu>
\res\layout\activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.menutest.MainActivity" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="52dp"
android:layout_marginTop="70dp"
android:ems="10" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText1"
android:layout_below="@+id/editText1"
android:layout_marginLeft="18dp"
android:layout_marginTop="31dp"
android:text="menu text2" />
</RelativeLayout>
MainActivity.java
package com.example.menutest;
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View.OnCreateContextMenuListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
final int FONT_10 = 0x111 ;
final int FONT_12 = 0x112 ;
final int FONT_14 = 0x113 ;
final int FONT_16 = 0x114 ;
final int FONT_18 = 0x115 ;
// define common menu idify
final int PLAIN_ITEM = 0x11b ;
//define text color
final int FONT_RED = 0x116 ;
final int FONT_GREEN = 0x117 ;
final int FONT_BLUE= 0x118 ;
final int MALE= 0x120 ;
final int FEMALE= 0x121 ;
private EditText edit ;
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit = (EditText) findViewById(R.id.editText1);
edit.setText("menu text");
text = (TextView) findViewById(R.id.textView1);
registerForContextMenu(text);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
unregisterForContextMenu(text);
super.onDestroy();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
//super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.my_context, menu);
menu.setHeaderIcon(R.drawable.ic_phone_24dp);
menu.setHeaderTitle("please select color!");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
// return true;
/* SubMenu fontMenu = menu.addSubMenu("font size");
fontMenu.setIcon(R.drawable.ic_launcher);
fontMenu.setHeaderIcon(R.drawable.ic_launcher);
fontMenu.add(0, FONT_10, 0, "10 size font");
fontMenu.add(0, FONT_12, 0, "12 size font");
fontMenu.add(0, FONT_14, 0, "14 size font");
fontMenu.add(0, FONT_16, 0, "16 size font");
fontMenu.add(0, FONT_18, 0, "18 size font");
menu.add(0, PLAIN_ITEM, 0, "common menu");
SubMenu colorMenu = menu.addSubMenu("font color");
colorMenu.setIcon(R.drawable.ic_phone_24dp);
colorMenu.setHeaderIcon(R.drawable.ic_phone_24dp);
colorMenu.add(0,FONT_RED,0,"red");
colorMenu.add(0,FONT_GREEN,0,"green");
colorMenu.add(0,FONT_BLUE,0,"blue");
return super.onCreateOptionsMenu(menu);*/
/*
SubMenu fontMenu = menu.addSubMenu("font size");
fontMenu.setIcon(R.drawable.ic_launcher);
fontMenu.setHeaderIcon(R.drawable.ic_launcher);
MenuItem Font10 = fontMenu.add("10 size font");
MenuItem Font12 = fontMenu.add("12 size font");
MenuItem Font14 = fontMenu.add("14 size font");
MenuItem Font16 = fontMenu.add("16 size font");
MenuItem Font18 = fontMenu.add("18 size font");
Font10.setOnMenuItemClickListener( new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
edit.setTextSize(10*2);
return false;
}
});
Font12.setOnMenuItemClickListener( new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
edit.setTextSize(12*2);
return false;
}
});
*/
/* 4
SubMenu startAcitvityMenu = menu.addSubMenu("start activity");
startAcitvityMenu.setIcon(R.drawable.ic_launcher);
startAcitvityMenu.setHeaderIcon(R.drawable.ic_phone_24dp);
startAcitvityMenu.setHeaderTitle("activity");
MenuItem startActivityItem = startAcitvityMenu.add("see activity");
startActivityItem.setIntent(new Intent(this, other.class));*/
getMenuInflater().inflate(R.menu.my_menu, menu);
return true;
//return super.onCreateOptionsMenu(menu);
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.font_10:
edit.setTextSize(10*2);
break;
case R.id.font_12:
edit.setTextSize(12*2);
break;
case R.id.font_14:
edit.setTextSize(14*2);
break;
case R.id.font_16:
edit.setTextSize(16*2);
break;
case R.id.font_18:
edit.setTextSize(18*2);
break;
case R.id.red_font:
edit.setTextColor(Color.RED);
break;
case R.id.green_font:
edit.setTextColor(Color.GREEN);
break;
case R.id.blue_font:
edit.setTextColor(Color.BLUE);
break;
case R.id.plain_item:
Toast.makeText(this, "你点击该普通菜单", 3000).show();
break;
}
return true ;
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.red:
text.setTextColor(Color.RED);
item.setChecked(true);
break;
case R.id.green:
text.setTextColor(Color.GREEN);
item.setChecked(true);
break;
case R.id.blue:
text.setTextColor(Color.BLUE);
item.setChecked(true);
break;
}
// return super.onContextItemSelected(item);
return true;
}
/* @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
// int id = item.getItemId();
// if (id == R.id.action_settings) {
// return true;
// }
// return super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case FONT_10 :
edit.setTextSize(10*2);
break;
case FONT_12 :
edit.setTextSize(12*2);
break;
case FONT_14 :
edit.setTextSize(14*2);
break;
case FONT_16 :
edit.setTextSize(16*2);
break;
case FONT_18 :
edit.setTextSize(18*2);
break;
case FONT_RED :
edit.setTextColor(Color.RED);
break;
case FONT_GREEN :
edit.setTextColor(Color.GREEN);
break;
case FONT_BLUE :
edit.setTextColor(Color.BLUE);
break;
case PLAIN_ITEM :
Toast.makeText(this, "you click common menu", Toast.LENGTH_LONG).show();
break;
}
return true ;
}
*/
}
效果如下: