系统菜单的基本实现
- onCreateOptionsMenu():当用户按下设置键时,系统会调用这个方法,其中的Menu参数就是我们要显示的菜单;
- onOptionsItemSelected():当用户选择一个菜单项时,系统会转到这个方法中进行处理。
创建菜单的两种方式
1)代码创建
添加菜单项
public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)
参数:
- groupId:组ID
- itemId:菜单项ID,整个activity中,这个ID- 值必须是唯一的。
- order:是在一个菜单中的排序顺序,一个菜单的排序顺序会根据这个值,由小到大排列菜单项。
添加子菜单
SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, “子菜单—SubMenu”);
subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon
菜单组操作
* setGroupVisible():将指定组的菜单设置为可见或不可见
* setGroupEnabled():将指定组的菜单设置为可用或不可用
* setGroupCheckable():将指定组的菜单设置为单选或多选
给菜单项添加一个Icon
MenuItem menuItem=menu.add(groupId_2, 6, 6, “2——去掉第一组的checkable”);
menuItem.setIcon(R.drawable.ic_launcher);
//给子菜单的菜单项添加Icon图标
MenuItem subItem=subMenu.add(groupId_3, 11, 3,”submenu_3”);
subItem.setIcon(R.drawable.ic_launcher);
public class MainActivity extends Activity {
private Menu mMenu;
private int groupId_1=1;
private int groupId_2=2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
mMenu=menu;
//添加第一组菜单
menu.add(groupId_1, 1, 1, "1——将第二组按钮不可见");
menu.add(groupId_1, 2, 2, "1——将第二组按钮可见");
menu.add(groupId_1, 3, 3, "1——将第二组按钮不可用");
menu.add(groupId_1, 4, 4, "1——将第二组按钮可用");
//添加第二组菜单
menu.add(groupId_2, 5, 5, "2——将第一组变成checkable");
//给一个菜单项添加Icon
MenuItem item=menu.add(groupId_2, 6, 6, "2——去掉第一组的checkable");
item.setIcon(R.drawable.ic_launcher);
//添加子菜单
SubMenu subMenu=menu.addSubMenu(groupId_2, 7, 7, "子菜单---SubMenu");
subMenu.setIcon(R.drawable.ic_launcher);//给SubMenu设置Icon
//给SubMenu添加菜单项
subMenu.add(groupId_3, 9, 1,"submenu_1");
subMenu.add(groupId_3, 8, 2,"submenu_2");
//给子菜单的菜单项添加Icon图标
MenuItem subItem=subMenu.add(groupId_3, 11, 3,"submenu_3");
subItem.setIcon(R.drawable.ic_launcher);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
mMenu.setGroupVisible(groupId_2, false);
break;
case 2:
mMenu.setGroupVisible(groupId_2, true);
break;
case 3:
mMenu.setGroupEnabled(groupId_2, false);
break;
case 4:
mMenu.setGroupEnabled(groupId_2, true);
break;
case 5:
mMenu.setGroupCheckable(groupId_1, true, false);
//最下面有最后一个参数true和false的区别,简单来说,设为False,可多选,设为True,只能单选
break;
case 6:
mMenu.setGroupCheckable(groupId_1, false, false);
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
}
OnMenuItemClickListener() Item点击监听器
菜单项点击事件除了可以在onOptionsItemSelected()函数中进行拦截,还可以给MenuItem 使用setOnMenuItemClickListener()单独设置点击事件监听器。
注意:
1. 每一个监听函数仅针对一个item,所以如果使用自定义OnMenuItemClickListener监听函数,就要对每一个Item都要自定义一个,对于没有定义监听函数的MenuItem,消息仍会派发到onOptionsItemSelected()中进行处理;
2. 对于设定了监听函数的Item,系统会在自定义的OnMenuItemClickListener函数中进行处理,即便在onOptionsItemSelected()中也写了处理函数,但系统是不会再进入onOptionsItemSelected()中点击消息的;
menu.add(groupId_1, 1, 1, "menu1_1").setOnMenuItemClickListener(listener);
//自定义一个MenuItemClickListener监听函数
OnMenuItemClickListener listener =new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(),"listener response:" + item.getTitle(), Toast.LENGTH_SHORT).show();
return false;
}
};
2)XML创建
标签
<group>
标签:
- id:组的Id值;
- heckableBehavior:用于指定菜单组内各项菜单项的选择行为,none(不可选)、all(多选 )、single(单选);
- menuCategory:用于对菜单分类,指定菜单的优先级,可选值为:container、system、secondary和alternative;
- enabled:用于指定该菜单组中的全部菜单项是否可用;
- visible:用于指定该菜单组中全部菜单项是否可见;
<item>
标签:
- id:菜单项的ID;必须唯一
- title:用于为菜单项指定标题
- icon:用于为菜单项指定图标
- enabled:用于指定该菜单项是否可用
- checkable:用于指定该菜单项是否可选
- checked:用于指定该菜单项是否已选中
- visible:用于指定该菜单项是否可见
- alphabeticShortcut:用于为菜单项指定字符快捷皱键
- numericShortcut:用于为菜单项指定数字快捷皱键
xml布局
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.testmenu_xml.MainActivity" >
<group android:id="@+id/menuGroup_main">
<item android:id="@+id/menuItem_1"
android:icon="@drawable/ic_launcher"
android:title="menu_1"/>
<item android:id="@+id/menuItem_2"
android:icon="@drawable/ic_launcher"
android:title="menu_2"/>
<item android:id="@+id/menuItem_3"
android:icon="@drawable/ic_launcher"
android:title="menu_3">
<!-- 子菜单 -->
<menu >
<group android:id="@+id/group_2">
<item android:id="@+id/sub_1" android:title="sub_1"/>
<item android:id="@+id/sub_2" android:title="sub_2"/>
<item android:id="@+id/sub_3" android:title="sub_3"/>
</group>
</menu>
</item>
</group>
</menu>
实例化Xml布局文件
使用MenuInflater将main.xml菜单文件与menu绑定起来;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.main, menu);
return true;
}
设置点击监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
//通过ID来响应菜单项
if (id == R.id.menuItem_1) {
Toast.makeText(MainActivity.this, "menu_1", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
上下文菜单
上下文菜单是针对某个控件单独设计的。一个页面的上下文菜单可以有很多个,每个控件都可以对应一个,但每个控件也只能有一个上下文菜单。
上下文菜单从产生到处理总共需要经过三个流程:
注册->编写菜单->针对菜单项处理
1) 注册 registerForContextMenu
TextView tvHelloWorld=(TextView)findViewById(R.id.helloword);
registerForContextMenu(tvHelloWorld);//注册上下文菜单
2) 创建菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//根据View来判断当前要产生哪个Menu
if (v==tvHelloWorld) {
menu.add(0, 0, 0, "tv_menu_1");
menu.add(0, 1, 1, "tv_menu_2");
menu.add(0, 2, 2, "tv_menu_3");
menu.add(0, 3, 3, "tv_menu_4");
}
}
3) 菜单项处理
@Override
public boolean onContextItemSelected(MenuItem item) {
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
switch (item.getItemId()) {
case 1:
tvHelloWorld.setText("hello kity");
break;
default:
break;
}
return super.onContextItemSelected(item);
}