Android 菜单, option menu 和 context menu (右键菜单)

来源:互联网 发布:淘宝情侣店铺有真的吗 编辑:程序博客网 时间:2024/04/25 18:52

1. 菜单分为option menu 和 context menu (右键菜单)

创建菜单的方式有两种: 通过xml配置  和  代码生成

菜单的样式 4.0 后有变化,如果要回到之前2.x的样式可以配置activity的属性 android:theme="@android:style/Theme"

4.0后的菜单不能设置icon , 可以通过实例中的方法设置

option menu 只需创建 和 监听事件, context在创建之前需要在某一个view上注册


MainActivity.java

package com.example.menu_actionbar;import java.lang.reflect.Method;import java.util.ArrayList;import android.os.Bundle;import android.app.Activity;import android.app.ListActivity;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.Menu;import android.view.MenuItem;import android.view.SubMenu;import android.view.View;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.ArrayAdapter;import android.widget.Toast;public class MainActivity extends ListActivity {private String[] colors = {"red", "green", "blue"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, colors);setListAdapter(adapter);//ContextMenu 右键菜单效果, 使用前先注册到对应的View, 一般在ListView上使用registerForContextMenu(getListView());}//Context Menu, 创建 和 事件响应@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.main, menu);setIconEnable(menu, true);super.onCreateContextMenu(menu, v, menuInfo);}@Overridepublic boolean onContextItemSelected(MenuItem item) {//info知道是点击的哪个listviewAdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();switch (item.getItemId()) {case R.id.menu_settings:Toast.makeText(this, "click setting item, "+info.position, Toast.LENGTH_SHORT).show();break;case R.id.menu_call:Toast.makeText(this, "click call item"+info.position, Toast.LENGTH_SHORT).show();break;case R.id.menu_edit:Toast.makeText(this, "click edit item"+info.position, Toast.LENGTH_SHORT).show();break;default:break;}return super.onContextItemSelected(item);}//OptionsMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//方式一: 通过xml配置menugetMenuInflater().inflate(R.menu.main, menu);setIconEnable(menu, true);//方式二: 代码添加//menu.add(0, 1, Menu.NONE, "Send");//SubMenu subMenu = menu.addSubMenu(0, 2, Menu.NONE, "Edit");//subMenu.add(1, 21, 1, "Edit1");//subMenu.add(1, 22, 2, "Edit2");//add 方法的参数//groupId,组别,用来划分itemid的。一般为Menu.NONE//itemId,ID。是menu识别编号,供识别menu用的,很重要//order,顺序。这个参数的大小决定菜单选项出现的先后顺序。顺序按照参数由小到大//title,显示文本return true;}//OptionsMenu item被选中的触发事件 @Overridepublic boolean onOptionsItemSelected(MenuItem item) {Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();return super.onOptionsItemSelected(item);}// 4.0 后不能设置icon的原因是 MenuBuilder中默认的setOptionalIconsVisible被设置falseprivate void setIconEnable(Menu menu, boolean enable)    {    try     {Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);m.setAccessible(true);//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)m.invoke(menu, enable);} catch (Exception e) {e.printStackTrace();}    }}
res/menu/main.xml  菜单配置

<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/menu_settings"        android:orderInCategory="100"        android:showAsAction="never"        android:title="@string/action_settings"        android:icon="@android:drawable/ic_menu_set_as" />             <item         android:menuCategory="container"        android:id="@+id/menu_edit"        android:title="Edit"        android:icon="@android:drawable/ic_menu_edit">                <menu>            <item android:title="Edit title" android:visible="true" android:enabled="true"/>            <item android:title="Edit text"  android:visible="true" android:enabled="true"/>        </menu>            </item>        <item         android:id="@+id/menu_call"        android:title="Call"        android:icon="@android:drawable/ic_menu_call"/></menu>




0 0