Android菜单详解——理解android中的Menu
前言
今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享。
PS:强烈推荐《Pro Android 3》,是我至今为止看到的最好的一本android书,中文版出到《精通Android 2》。
理解Android的菜单
菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性。Android SDK提供的菜单有如下几种:
-
选项菜单:最常规的菜单,android中把它叫做option menu
-
子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
-
上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
-
图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标。
-
选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过(其实是我还没弄明白啦o(≧v≦)o~~)
-
扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都作为“更多”菜单的子菜单项。如下图:
第6个菜单项自动变为“更多” 点击“更多”显示其他菜单项
Android3.0又引入了一个叫action bar的东西,本文不做讲解,大家自己google。
android.view.Menu接口代表一个菜单,android用它来管理各种菜单项。注意我们一般不自己创建menu,因为每个Activity默认都自带了一个,我们要做的是为它加菜单项和响应菜单项的点击事件。android.view.MenuItem代表每个菜单项,android.view.SubMenu代表子菜单。其三者的关系可以用下图来表示
上面说过,每个activity包含一个菜单,一个菜单又能包含多个菜单项和多个子菜单,子菜单其实也是菜单(因为它实现了Menu接口),因此子菜单也可以包含多个菜单项。SubMenu继承了Menu的addSubMenu()方法,但调用时会抛出运行时错误。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了两个回调方法,用于创建菜单项和响应菜单项的点击。
)——创建并响应选项菜单
上一篇《Android菜单详解(一)——理解android中的menu》简单介绍了一下Android的菜单,今天让我们看一下如何通过代码创建和响应最常用的选项菜单(options menu)。
创建options menu
之前提到,Android的activity已经为我们提前创建好了android.view.Menu对象,并提供了回调方法onCreateOptionsMenu(Menu menu)供我们初始化菜单的内容。该方法只会在选项菜单第一次显示的时候被执行,如果你需要动态改变选项菜单的内容,请使用 onPrepareOptionsMenu(Menu)
。
1
2
3
4
5
6
7
8
9
|
@Override
onCreateOptionsMenu(Menu menu) {
.onCreateOptionsMenu(menu);
menu.add(
"菜单项1"
);
menu.add(R.string.menuitem2);
menu.add(
1
, Menu.FIRST, Menu.FIRST,
"菜单项3"
); ;
}
|
上面的代码演示了添加菜单项的3种方法,下面解释下第三种方法
add(int groupId, int itemId, int order, CharSequence title)。其中,第一个参数是组号,android中你可以给菜单分组,以便快速地操作同一组的菜单。第二个参数指定每个菜单项的唯一ID号,你可以自己指定,也可以让系统来自动分配,在响应菜单时你需要通过ID号来判断哪个菜单被点击了。因此常规的做法是定义一些ID常量,但在android中有更好的方法,就是通过资源文件来引用,这个之后介绍。第三个参数代表菜单项显示顺序的编号,编号小的显示在前面。
给菜单项分组
1
2
3
4
5
6
7
8
9
10
11
|
@Override
onCreateOptionsMenu(Menu menu) {
.onCreateOptionsMenu(menu);
group1 =
1
;
gourp2 =
2
;
menu.add(group1,
1
,
1
,
"item 1"
);
menu.add(group1,
2
,
2
,
"item 2"
);
menu.add(gourp2,
3
,
3
,
"item 3"
);
menu.add(gourp2,
4
,
4
,
"item 4"
);
;
}
|
你可以向上面这样给菜单项分组,分组之后就能使用menu中提供的方法对组进行操作了,如下:
menu.removeGroup(group1); menu.setGroupVisible(gourp2, visible); menu.setGroupEnabled(gourp2, enabled); menu.setGroupCheckable(gourp2, checkable, exclusive);
响应菜单项
android提供了多种响应菜单项的方式,下面一一介绍
1、通过onOptionsItemSelected方法
使用的最多方法是重写activity类的 onOptionsItemSelected(MenuItem)
回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Override
onOptionsItemSelected(MenuItem item) {
(item.getItemId()) {
1
:
;
2
:
;
3
:
;
4
:
;
:
.onOptionsItemSelected(item);
}
;
|