菜单Menu

在android中提供了一些简单的方法为上下文添加Menu菜单:

有三种类型的应用菜单:

OptionMenu:选项菜单:android中最常见的菜单,通过Menu键来调用

SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框,子菜单不支持嵌套,即不能包括其他子菜单

ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单

!!!注意一下:!!!

子菜单项,上下文菜单项,扩展菜单项均无法显示图标

ps:扩展菜单:选项菜单最多只能显示6个菜单项,当多于6个的时候,第六个会变成一个子菜单,用于显示装不下的部分

一.OptionMenu:选项菜单:

(一)实现流程:

1.重写onCreateOptionMenu()方法,在这里实现菜单项的内容

2.重写onOptionItemSelected()方法,这里是菜单项被单击后的回调方法,即判断点击的是哪个菜单项的触发事件

(二)代码实例:

①最普通的创建方式,在java中直接添加Title,完成对菜单项的添加

程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class MainActivity extends Activity {  

//1.定义不同颜色的菜单项的标识:
final private int RED = 110;
final private int GREEN = 111;
final private int BLUE = 112;
final private int YELLOW = 113;
final private int ORANGE = 114;
//获取布局中的TextView
private TextView text;

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

text = (TextView) findViewById(R.id.textchange);
}

@Override
//2.这里的是创建选项菜单的方法
public boolean onCreateOptionsMenu(Menu menu) {
// 当我们点击Menu键时,就会触发该方法
super.onCreateOptionsMenu(menu);
//添加菜单项:
//参数依次为:指定菜单项的组号,ID,排序号,标题
//排序号:按添加顺序排序的话就都填0
menu.add(1,RED,4,"红色");
menu.add(1,GREEN,2,"绿色");
menu.add(1,BLUE,3,"蓝色");
menu.add(1,YELLOW,1,"黄色");
return true;
}

//3.这里是选项菜单被点击后的回调方法,即点击菜单后触发该方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case RED:
text.setTextColor(Color.RED);
break;
case GREEN:
text.setTextColor(Color.GREEN);
break;
case BLUE:
text.setTextColor(Color.BLUE);
break;
case YELLOW:
text.setTextColor(Color.YELLOW);
break;
}
return true;
}
}

运行截图:

点击Menu键后:


点击绿色后:

②建立菜单资源文件,并解析到menu中

首先定义一个菜单的资源文件:在res/menu目录直接新建:选择menu的类型的xml,建立menus的菜单资源文件:

menus.xml:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/item1" android:title="@string/addper"/>
<item android:id="@+id/item2" android:title="@string/deleteper"/>
<item android:id="@+id/item3" android:title="@string/addgroup"/>
<item android:id="@+id/item4" android:title="@string/deletegroup"/>
<group android:id="@+id/setting">
<item android:id="@+id/back" android:title="@string/setimg" android:enabled="false"></item>
<item android:id="@+id/sound" android:title="@string/setsound" android:visible="false"></item>
</group>
</menu>

代码解释:

enabled:设置菜单项是否可用

visible:设置菜单项是否可见

group标记:将定义的菜单包装成一个菜单组

title:标题都调用string来存放字符串,这个随你

接着就是在java文件中对该菜单资源文件的加载了

这里要用到一个菜单的动态加载类:MenuInflator inflator = new MenuInflator (this);

接着调用inflate()方法解析菜单文件

代码:

1
2
3
4
5
6
7
8
9
10
11
12
public boolean onCreateOptionsMenu(Menu menu) {  
MenuInflater inflator = new MenuInflater(getApplicationContext());
inflator.inflate(R.menu.menus, menu);
return super.onCreateOptionsMenu(menu);
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
Toast.makeText(getApplicationContext(), item.getTitle(), Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}

运行截图:

代码解释:

这里的话因为我们设置了第五个菜单项不可以用,所以变灰了,还有第六个菜单项不见了,也是因为我们在菜单资源文件中设置了

菜单不可见

①②源码下载:

http://pan.baidu.com/s/1gSf5s

③点击某个菜单项时直接启动其他的Activity

直接调用MenuItem的setIntent(Intent)方法即可启动对应的activity

这里过于简单就略过了

二.ContextMenu上下文菜单

实现步骤:

1.重写onCreateContextMenu()方法

2.为view组件注册上下文菜单,使用registerForContextMenu()方法,参数是视图组件

3.重写onContextItemSelected()方法为菜单项指定事件监听器

ps:虽然android提供了两种创建菜单的方法:java代码中创建或者xml资源文件中定义

一般使用后者来定义菜单,这样可以减少java代码的臃肿,而且不用此次都用代码分配id,只需要修改xml文件即可修改菜单内容,而不必修改java代码的内容,

这样为程序提供了更好的解耦(代码分离)

所以以下定义菜单我们都使用xml资源文件进行定义

ContextMenu实例:

先建立一个菜单资源文件:

checkableBehavior:参数有三个:single设置为单选,all为多选,none为普通选项

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义一组单选按钮 -->
<group android:checkableBehavior="single">
<item android:id="@+id/blue" android:title="@string/bluetitle"/>
<item android:id="@+id/green" android:title="@string/greentitle"/>
<item android:id="@+id/red" android:title="@string/redtitle"/>
</group>
</menu>

接着再java文件中,为textview注册一个上下文菜单

重写onCreateContextMenu()方法,新建一个MenuInflater对象,调用inflate装填菜单资源文件

重写onContextItemSelected方法,这个是点击菜单项时触发

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MainActivity extends Activity {  

private TextView text;

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

text = (TextView) findViewById(R.id.text);
//为textView注册一个上下文菜单
registerForContextMenu(text);
}

@Override
//重写上下文菜单的创建方法
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflator = new MenuInflater(this);
inflator.inflate(R.menu.menus, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}

//上下文菜单被点击是触发该方法
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.blue:
text.setTextColor(Color.BLUE);
break;
case R.id.green:
text.setTextColor(Color.GREEN);
break;
case R.id.red:
text.setTextColor(Color.RED);
break;
}
return true;
}
}

运行截图(长按TextView)

代码解释:

代码中的注释很详细,这里就略过了

三.SubMenu子菜单

在xml中只需要在<Item>中嵌套<menu>即可

实例:

menus.xml

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/submenu" android:title="多选按钮演示">
<menu>
<group android:checkableBehavior = "all">
<item android:id="@+id/one" android:title = "子菜单一"/>
<item android:id="@+id/two" android:title = "子菜单二"/>
<item android:id="@+id/three" android:title = "子菜单三"/>
</group>
</menu>
</item>
</menu>

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//重写上下文菜单的创建方法  
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflator = new MenuInflater(this);
inflator.inflate(R.menu.menus, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}

//上下文菜单被点击是触发该方法
@Override
public boolean onContextItemSelected(MenuItem item) {
item.setChecked(true);
switch (item.getItemId()) {
case R.id.one:
item.setCheckable(true);
break;
case R.id.two:
item.setCheckable(true);
break;
case R.id.three:
item.setCheckable(true);
break;
}
return true;
}

运行截图:

点击后:


代码解释:

这个代码和上面上下文的菜单没什么不同,只是修改了一下menus文件的内容,使用了子菜单

如果想在Java代码中设置上下文代码只需要:addSubMenu()

SubMenu file = menu.addSubMenu("文件");类似于这样,file还要add添加菜单项哦!