Android_Menu常用菜单详解

来源:互联网 发布:netstat监听端口 编辑:程序博客网 时间:2024/05/19 18:17

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.为该选项菜单增加选择事件@Overridepublic boolean onOptionsItemSelected(MenuItem item) {//得到子菜单idswitch (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;@Overrideprotected 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的idlist.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;@Overrideprotected 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围绕anchorMenuInflater inflater = popupMenu.getMenuInflater(); // 得到MenuInflater加载器inflater.inflate(R.menu.w, popupMenu.getMenu()); // 加载menu对象// 2.设定点击事件,当用户点击该按钮后,显示该menu对象button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {popupMenu.show(); // 显示popupmenu对象}});// 3.设定menu的点击事件(可以执行相应的操作)popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {@Overridepublic 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() {@Overridepublic void onDismiss(PopupMenu menu) {Toast.makeText(MainActivity.this, "消失", 1).show();}});}}