1.menu概述
(1).Options menu
开发应用版本在 Android 2.3.x (API level 10) 及以下版本顺利运行,如果用户点击了menu按钮则该选项菜单将显示在手机品目的底端,如果菜单条目超过6个,将多余的可能溢出的item条目封装在more条目中。
(2).Action bar
开发应用在Android 3.0 (API level 11) 及以上版本,item主要包含一些重要的动作,在<item>标签中定义了android:showAsAction="ifRoom",将可能出现在Action Bar位置右边。
(3).Context menu
开发应用版本在 Android 2.3.x (API level 10) 及以下版本顺利运行,上下文菜单常用于ListView,GridView或者view集合中,当用户长按一个view对象时,该menu显示,类似于对话框。
(4).Contextual action mode
开发应用在Android 3.0 (API level 11) 及以上版本,该模式实现了ActionMode,展现在屏幕的顶端,类似ActionBar
(5).Popup menu
点击按钮弹出一个菜单
2.Menu xml文件定义
android提供了一种标准的menu xml文件定义格式化,而不是在应用代码中定义。通过menu加载器将res/menu/下的 menu xml资源文件加载进activity或fragment.下面列举的是menu xml文件中,主要的元素标签
(1).<menu>
该menu标签为menu xml文件的根节点元素标签,是menu items的容器,里面可容纳一个或者多个<item>和<group>标签
(2).<item>
代表了菜单中一个具体的菜单条目,该条目可对应一个具体的操作信息,或者展开内部包含的子菜单信息(在item标签内部定义menu标签)
(3).<group>
可选标签,其左右是方便操作该group中的所有子item标签属性,比如group下的所有item隐藏,不可操作或者不可选中
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 将group标签中的item封装为一组,可方便操作 --> <group android:id="@+id/group"> <item android:id="@+id/dell" android:showAsAction="ifRoom|withText" android:title="Delete"/> <item android:id="@+id/share" android:showAsAction="ifRoom|withText" android:title="Share"/> </group> <!-- more中包含子菜单 --> <item android:id="@+id/more" android:showAsAction="ifRoom|withText" android:title="more..."> <menu> <item android:id="@+id/del" android:icon="@android:drawable/ic_menu_delete" android:showAsAction="ifRoom|withText" android:title="Delete"/> <item android:id="@+id/share" android:icon="@android:drawable/ic_menu_share" android:showAsAction="ifRoom|withText" android:title="Share"/> </menu> </item> </menu>
3.Options menu与Action bar
在开发选项按钮时,在高版本开发的ActionBar,在低版本上也可以以不同方式展现,后面博文将重点讲解ActionBar
class OptionMenuTest extends Activity{
// 1.实现onCreateOptionsMenu方法
public boolean onCreateOptionsMenu(Menu menu) {
//用menu加载器将menu xml文件加载进来
this.getMenuInflater().inflate(R.menu.main, menu);
return true;
}
// 2.为该选项菜单增加选择事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//得到子菜单id
switch (item.getItemId()) {
case R.id.bt:
Toast.makeText(this, "设置", 0).show();
return true;
default:
break;
}
return false;
}
}
4.Contextual Menus
上下文菜单常见作用于ListView, GridView对象
public class ContextMenuTest extends Activity {
private List<String> list;
private ListView listView;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* 1.在Activity的onCreate方法区,注册上下文菜单,需要指定view对象 该步对知道
* 的view对象(listView)设定了OnCreateContextMenuListener监听器
*/
registerForContextMenu(listView);
}
/*
* 2.在onCreateContextMenu方法中,将menu布局通过MenuInlater加载进来
*/
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = getMenuInflater(); // 得到menu加载器
inflater.inflate(R.menu.w, menu); // 将指定的布局加载
}
/*
* 3.捕获Context菜单的事件,可以执行相应的操作
*/
public boolean onContextItemSelected(MenuItem item) {
// 通过菜单信息,可以得到用户长按的listView等item条目信息
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.title1:
Toast.makeText(this, "Delete:" + item.toString(), 1).show();
return true;
case R.id.title2:
// 特殊:下面这个例子中的listView每个条目只有一条,可以简单当做TextView文本
((TextView) info.targetView).setText(new Date()
.toLocaleString());
// 通过 info.id 可以得到用户点击listView的id
list.set((int) info.id, new Date().toLocaleString());
return true;
default:
return super.onContextItemSelected(item);
}
}
}
5.Popup Menu
弹出菜单
public class PopupMenuTest extends Activity {
private List<String> list;
private ListView listView;
private Button button;
private boolean flag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.bt);
// 1.创建popupMenu对象
final PopupMenu popupMenu = new PopupMenu(this, button); // 第二个参数anchor,指该popupmenu围绕anchor
MenuInflater inflater = popupMenu.getMenuInflater(); // 得到MenuInflater加载器
inflater.inflate(R.menu.w, popupMenu.getMenu()); // 加载menu对象
// 2.设定点击事件,当用户点击该按钮后,显示该menu对象
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.show(); // 显示popupmenu对象
}
});
// 3.设定menu的点击事件(可以执行相应的操作)
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// 对于一些item
// 在<group>标签容器中,可以指定设点该group标签下的item是否可见,可编辑,可选中等多种设置
// popupMenu.getMenu().setGroupVisible(R.id.a, flag);
// //设置group内容是否可见
// popupMenu.getMenu().setGroupEnabled(R.id.a, flag);
// //设置group内容是否操作
// popupMenu.getMenu().setGroupCheckable(R.id.a,
// flag);//设置group内容是否选中
// 在menu中,得到用户点击的item项
switch (item.getItemId()) {
case R.id.title1:
Toast.makeText(MainActivity.this, "Delete", 1).show();
return true;
case R.id.title2:
Toast.makeText(MainActivity.this, "Edit", 1).show();
return true;
}
return false;
}
});
// 设定当前popupmenu消失时,相应的OnDismissListener事件
popupMenu.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(PopupMenu menu) {
Toast.makeText(MainActivity.this, "消失", 1).show();
}
});
}
}