Android menu笔记

Author : lovecicy

Android系统提供了3中基本的菜单,分别是option menu/action bar,上下文相关菜单和弹出菜单。

第一种菜单是菜单项的基本集合,你应该将对应用有全局影响的动作放在这里,比如“搜索”,“写邮件”,“设置”等等。

option menu/action bar的显示位置取决于系统的版本,如果是2.3及以下版本,菜单将显示在屏幕下方,菜单最多显示6个菜单项,如果多于6个,则第六个及以后的菜单项将被隐藏在溢出菜单中,第六个菜单项将变成“更多”按钮,点击呼出溢出菜单;如果系统版本为3.0及以上,菜单将显示在屏幕顶部的action bar中。

创建方法:

1、复写Activity的onCreateOptionsMenu(Menu menu)方法创建菜单,在此方法中使用MenuInflater类的inflate()方法填充菜单。

2、复写Activity的onOptionsItemSelected(MenuItem item)方法处理菜单项选择事件,通过item参数判断哪个菜单项被点击了。

如果你的Activity中包含Fragment,则Activity的回调函数先被调用,如果事件没有被处理,则通过调用父类的回调函数,可以将事件依次传递给Fragment的回调函数,直到true被返回或者所有的Fragment都调用了。Activity和Fragment的默认实现会返回false。

总结:两张菜单类型的显示模式取决于系统版本,实现代码是同一套。

第二种菜单是上下文相关菜单。

上下文相关菜单主要用在ListView、GridView和视图集合,用户可以对每条条目做某些操作。

有两种方式可以实现上下文相关代码:一、浮动上下文菜单;二、上下文相关动作模式。浮动菜单允许你对一个项目进行操作,而上下文相关模式则可以实现对多个项目的操作。安卓在3.0时引入了上下文相关动作模式,在可能的时候,尽可能使用上下文相关动作模式,而不是浮动菜单。

浮动菜单的实现:

一、调用“registerForContextMenu()”方法并将要绑定的视图,如ListView,GridView作为参数传给此方法。

二、在你的Activity或者Fragment中实现“onCreateContextMenu()”方法。

三、实现“onContextItemSelected()”方法,系统将在菜单被点击是调用此回调方法。

如果你的Activity中包含Fragment,则Activity的回调函数先被调用,如果事件没有被处理,则通过调用父类的回调函数,可以将事件依次传递给Fragment的回调函数,知道true或者false被返回。Activity和Fragment的默认实现会返回false,因此,如果你没有处理事件,则必须调用父类的回调函数。

上下文相关动作模式的实现,对于独立的视图和可批量操作的ListView,GridView有两种不同的实现方式。

对于独立的视图,实现ActionMode.Callback接口,复写其生命周期函数和菜单处理函数,当要使用菜单时,比如视图的长按监听器回调函数中,调用Activity的“startActionMode()”方法。

对于ListView和GridView,调用其“setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL)”方法,再实现AbsListView.MultiChoiceModeListener(ActionMode.Callback接口的实现接口)接口,并将实例传给ListView的“setMultiChoiceModeListener()”方法。当调用ListView的“setItemChecked()”方法时也可激活菜单,但是choice mode必须设置为CHOICE_MODE_SINGLE或CHOICE_MODE_MULTIPLE。

总结:对于上下文菜单,不同的系统采用了不同的接口,需要对低版本做平稳退化,实现浮动菜单。

第三种,弹出菜单。

说实话,我没搞懂弹出菜单的意义,它和上下文相关菜单的区别是什么?谷歌开发者手册上的描述是这样的:A PopupMenu is a modal menu anchored to a View. It appears below the anchor view if there is room, or above the view otherwise.翻译过来大致是:弹出菜单是固定于某一个视图的形式化菜单,它出现在固定视图的下方或上方。

实现的方法很简单,实例化一个PopupMenu对象,给它的构造函数传一个要固定的视图对象,通过xml这是布局。实现Activity的“onMenuItemClick()”方法,设置PopupMenu对象的按钮监听器为当前Activity。

总结:弹出菜单的实现是最简单的,gmail app使用到了弹出菜单。

除此之外,通过xml布局文件,还能添加菜单组,子菜单。也可以通过Intent添加可用的MenuItem,比如根据系统可用的应用下载平台,添加可用的菜单选择项,点击每个菜单项可以打开对应的应用下载平台(Google Play,豌豆荚……)。

以上是我对android菜单的理解,有不对的地方,欢迎指正。

standard

Have your say