Android基础之Menu操作详解

来源:互联网 发布:中科院软件所导师 编辑:程序博客网 时间:2024/06/07 02:42

菜单操作
菜单是一种常见的应用程序与用户交互的方式,它使用类似列表的形式显示用户可以操作的功能,而用户则可以通过菜单来选择要执行的操作,应用程序也可以对用户的选择进行相关的响应。Android系统中的菜单大致分为选项菜单、子菜单、上下文菜单。

1、菜单分为两种
1)系统菜单(选项菜单)
创建系统菜单:
1、重写Activity的 onCreateOptionsMenu方法
调用menu对象的add方法添加菜单项
2、定义menu资源
重写Activity的onCreateOptionsMenu方法
根据menu资源扩充菜单
系统菜单的单击事件处理
重写Activity的 onOptionsItemSelected方法

2)上下文菜单
创建上下文菜单
为事件源对象设置OnCreateContextMenuListener监听器
上下文菜单的单击事件处理
重写Activity的 onContextItemSelected方法
注意:
如果上下文菜单事件的事件源是AdapterView对象
则,可以将上下文菜单项(MenuItem)的
getMenuInfo方法的返回值强制转换为AdapterContextMenuInfo
·选项菜单(OptionsMenu)是通过点击设备上的Menu键弹出的菜单;
- 通过res/menu下的XML文件可以配置选项菜单
- 在Activity中的onOptionsItemSelected()方法将用于选项菜单中菜单项的响应。
- 通常在配置选项菜单时,需要为每个菜单项配置如下属性:
1.id:菜单项的ID标识,用于响应菜单项时,判断当前点击的那个菜单项;
2.orderInCategory:序号,即存在多个菜单项时的排序,取值为整数,数值越小,则越靠前显示,数值越大,则越靠后显示;
3.showAsAction:将菜单项显示在ActionBar上,取值为枚举类型,包括never(从不显示在ActionBar上),always(始终显示在ActionBar上),ifRoom,withText,collapseActionView;
4.title:菜单项上显示的文字。

使用程序代码创建选项菜单
·在Activity的onCreateOptionsMenu方法中,使用参数menu即可创建菜单项。
·Menu类中定义的创建菜单项的方法:
public MenuItem add(int groupId,int itemId,int order,CharSequence title)
参数:groupId:菜单项分组
itemId:ItemId资源索引
order:菜单项的排序(数值越小越靠前)
title:显示在菜单项的文字
public MenuItem add(int groupId,int itemId,int order,int titleRes)
·子菜单(SubMenu)是选择某个菜单项后,再次弹出的下级菜单。
·选项菜单的子菜单(SubMenu)亦可通过配置文件或程序代码创建:
- 通过配置文件创建子菜单:为原有的上级菜单项的item节点添加menu子节点,并在menu子节点下再添加若干个item节点进行配置;
- 通过程序代码创建子菜单:调用Menu对象的addSubMenu()创建一般菜单项,通过返回值SubMenu对象创建子菜单。
·上下文菜单(ContextMenu)是通过长按(通常是2秒)某个空间后显示的菜单;
·通过重写Activity的OnContextMenu()方法可以初始化上下文菜单,菜单项的创建方式与在选项菜单中创建菜单项相同;
·需要调用registerForContextMenu(View view)方法将上下文菜单注册到某个控件之上;
·通过重写Activity的onContextMenuSelected()方法可以响应上下文菜单的选中事件。

示例1(系统菜单):
这里写图片描述

这里写图片描述
menu:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/action_file"        android:orderInCategory="1001"        android:showAsAction="never"        android:title="File">        <menu >            <item                 android:id="@+id/file_new"                android:orderInCategory="1"                android:showAsAction="never"                android:title="New"/>            <item                 android:id="@+id/file_close"                android:orderInCategory="2"                android:showAsAction="never"                android:title="Close"/>        </menu>     </item>    <item        android:id="@+id/action_edit"        android:orderInCategory="1002"        android:showAsAction="never"        android:title="Edit"/>    <item        android:id="@+id/action_source"        android:orderInCategory="1003"        android:showAsAction="never"        android:title="Source"/>    <item        android:id="@+id/action_search"        android:orderInCategory="1004"        android:showAsAction="never"        android:title="Search"/>    <item        android:id="@+id/action_run"        android:orderInCategory="1005"        android:showAsAction="never"        android:title="Run"/>    <item        android:id="@+id/action_help"        android:orderInCategory="1006"        android:showAsAction="never"        android:title="Help"/></menu>

activity:

package com.example.menu;import android.os.Bundle;import android.app.Activity;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.view.View;import android.view.ContextMenu.ContextMenuInfo;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private static final int MENU_FILE = 123;    private static final int MENU_EDIT = 124;    private static final int MENU_RUN = 125;    private static final int MENU_WINDOW = 126;    private static final int MENU_HELP = 127;    private static final int MENU_WINNDOW_SUB_FILE = 12341;    private static final int MENU_WINNDOW_SUB_EDIT = 324;    private static final int CONTENT_MENU_NAVIGATE = 765;    private static final int CONTENT_MENU_REFACTOR = 7865;    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView) findViewById(R.id.textView1);        registerForContextMenu(textView);    }    @Override    public void onCreateContextMenu(ContextMenu menu, View v,            ContextMenuInfo menuInfo) {        super.onCreateContextMenu(menu, v, menuInfo);        menu.add(Menu.FIRST, CONTENT_MENU_NAVIGATE, 1, "NAVIGATE");        menu.add(Menu.FIRST, CONTENT_MENU_REFACTOR, 1, "Refcator");    }    @Override    public boolean onMenuItemSelected(int featureId, MenuItem item) {        switch (item.getItemId()) {        case CONTENT_MENU_NAVIGATE:            Toast.makeText(this, "你选择了-->NAVIGATE菜单项", Toast.LENGTH_LONG).show();            break;        case CONTENT_MENU_REFACTOR:            Toast.makeText(this, "你选择了-->REFACTOR菜单项", Toast.LENGTH_LONG).show();            break;        }        return super.onMenuItemSelected(featureId, item);    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        //getMenuInflater().inflate(R.menu.main, menu);        menu.add(Menu.FIRST, MENU_FILE, 1, "File");        menu.add(Menu.FIRST, MENU_EDIT, 2, "Edit");        menu.add(Menu.FIRST, MENU_RUN, 3, "Run");        //menu.add(Menu.FIRST, MENU_WINDOW, 4, "Window");        menu.add(Menu.FIRST, MENU_HELP, 5, "Help");        SubMenu subMenu = menu.addSubMenu(Menu.FIRST, MENU_WINDOW, 4, "Window") ;        subMenu.add(Menu.FIRST, MENU_WINNDOW_SUB_FILE, 1, "file");        subMenu.add(Menu.FIRST, MENU_WINNDOW_SUB_EDIT, 2, "edit");        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case MENU_FILE:            break;        case MENU_EDIT:            Toast.makeText(this, "你选择了-->Edit文件", Toast.LENGTH_LONG).show();            break;        case MENU_RUN:            Toast.makeText(this, "你选择了-->Run文件", Toast.LENGTH_LONG).show();            break;        case MENU_WINDOW:            Toast.makeText(this, "你选择了-->Window文件", Toast.LENGTH_LONG).show();            break;        case MENU_HELP:            Toast.makeText(this, "你选择了-->Help文件", Toast.LENGTH_LONG).show();            break;        case MENU_WINNDOW_SUB_EDIT:            Toast.makeText(this, "你选择了-->MENU_WINNDOW_SUB_EDIT文件", Toast.LENGTH_LONG).show();            break;        case MENU_WINNDOW_SUB_FILE:            Toast.makeText(this, "你选择了-->MENU_WINNDOW_SUB_FILE文件", Toast.LENGTH_LONG).show();            break;        }        /*switch (item.getItemId()) {        case R.id.action_file:            Toast.makeText(this, "你选择了-->File文件", Toast.LENGTH_LONG).show();            break;        case R.id.action_edit:            Toast.makeText(this, "你选择了-->Edit文件", Toast.LENGTH_LONG).show();            break;        case R.id.action_source:            Toast.makeText(this, "你选择了-->Source文件", Toast.LENGTH_LONG).show();            break;        case R.id.action_search:            Toast.makeText(this, "你选择了-->Search文件", Toast.LENGTH_LONG).show();            break;        case R.id.action_run:            Toast.makeText(this, "你选择了-->Run文件", Toast.LENGTH_LONG).show();            break;        case R.id.action_help:            Toast.makeText(this, "你选择了-->Help文件", Toast.LENGTH_LONG).show();            break;        }        */        return super.onOptionsItemSelected(item);    }}

示例2(上下文菜单)
这里写图片描述

package com.example.menu;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.ArrayAdapter;import android.widget.ListView;public class ListViewMenuActivity extends Activity {    private static final int MENU_EDIT_ID = 0;    private static final int MENU_DELETE_ID = 1;    private List<String> datas;    private ListView listView;    private ArrayAdapter<String> adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_list_view_menu);        listView = (ListView) findViewById(R.id.listView);        datas=getData();        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datas);        listView.setAdapter(adapter);        registerForContextMenu(listView);    }    @Override    public void onCreateContextMenu(ContextMenu menu, View v,            ContextMenuInfo menuInfo) {        super.onCreateContextMenu(menu, v, menuInfo);        AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;        int position = info.position;        String context = datas.get(position);        menu.add(Menu.FIRST, MENU_EDIT_ID, 1, "Edit("+context+")");        menu.add(Menu.FIRST, MENU_DELETE_ID, 1, "Delete("+context+")");    }    @Override    public boolean onMenuItemSelected(int featureId, MenuItem item) {        switch (item.getItemId()) {        case MENU_EDIT_ID:            break;        case MENU_DELETE_ID:            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();            int position = info.position;            datas.remove(position);            adapter.notifyDataSetChanged();            break;        }        return super.onMenuItemSelected(featureId, item);    }    private  List<String> getData(){        List<String> data = new ArrayList<String>();        data.add("林俊杰");        data.add("张杰");        data.add("谢娜");        data.add("吉杰");        data.add("谢霆锋");        data.add("张卫健");        data.add("黄圣依");        data.add("崔健");        data.add("周杰伦");        data.add("许飞");        return data;    }}
0 0