Menu分为OptionMenu(点击MENU键时出现的菜单) ContextMenu(长点击一个菜单项时出现的菜单)
可以在XML文件中定义MENU,在res文件夹下建立menu目录,在下面定义菜单xml文件
<menu>必须是根目录,
其中每一个<item>是一个菜单项,也可以是一个<menu>来创建子菜单
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="@string/file" > <!-- "file" submenu --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
<item>有诸多属性如
android:id 当用户点击这个事件的时候可以识别这个item
android:icon item的图标
android:title item的标题
OptionMenu的使用
创建一个OptionMenu可以重写onCreateMenuItem()方法,在其中进行add(),
也可以根据XML文件来生成
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater()
;
inflater.inflate(R.menu.game_menu, menu);
return true;
}
重写onOptionsItemSelected()方法来指定点击item后的操作
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.new_game: newGame(); return true; case R.id.help: showHelp(); return true; default: return super.onOptionsItemSelected(item); } }如果要在activity的生命周期内动态更改OptionMenu,使用OnPrepareOptionsMenu(),而onCreateOptionsMenu()中add等操作之后,在activity整个生命周期中最好不变
ContextMenu的使用
通过调用registForContextMenu,把View传递进去进行注册,如果整个ListView或者GridView每一个item都需要一样的context menu,那就吧整个ListView,GridView传递给registerForContextMenu();
当一个item被长点击时,系统会调用onCreateContextMenu()
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }如果你的每一个item要调用不同的contextView可以在这里,利用参数View v,ContextMenuInfo menuInfo来进行生成不同的contextMenu
onContextItemSelected(MenuItem item)
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }
可以创建一个MenuGroup
<group android:id="@+id/group_delete"> <item android:id="@+id/menu_archive" android:title="@string/menu_archive" /> <item android:id="@+id/menu_delete" android:title="@string/menu_delete" /> </group>这样可以对成组的多个item进行setGroupVisible() setGroupEnable() setGroupCheckable()
可以创建一个ContextMenu,每一项item都是可选中的
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <!--single单个选中RadioButton all多个选中CheckBox none --!> <item android:id="@+id/red" android:title="@string/red" /> <item android:id="@+id/blue" android:title="@string/blue" /> </group> </menu>当一项被选中的时候,调用onOptionItemSelected()方法,但是必须要手动设定其Checked状态
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.vibrate: case R.id.dont_vibrate: if (item.isChecked()) item.setChecked(false); else item.setChecked(true); return true; default: return super.onOptionsItemSelected(item); } }如果不进行设定,用户选定的时候是不会变的...
当需要点击某个menuItem启动某个是自己应用的或者不是自己应用的Activity的时候,可以在回调方法中startActivity,
但如果不能确定是否有合适的activity或者有几个的时候,可以在onCreateOptionsMenu(Menu menu)中使用menu.addIntentOptions()方法
添加intent的category为 Intent.CATEGORY_ALTERNATIVE
@Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); // Create an Intent that describes the requirements to fulfill, to be included // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE. Intent intent = new Intent(null, dataUri); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); // Search and populate the menu with acceptable offering applications. menu.addIntentOptions( R.id.intent_group, // Menu group to which new items will be added 0, // Unique item ID (none) 0, // Order for the items (none) this.getComponentName(), // The current activity name null, // Specific items to place first (none) intent, // Intent created above that describes our requirements 0, // Additional flags to control items (none) null); // Array of MenuItems that correlate to specific items (none) return true; }当然,如果想让自己的Activity在menu中进行引用
<intent-filter label="@string/resize_image"> ... <category android:name="android.intent.category.ALTERNATIVE" /> <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> ... </intent-filter>
ActionBar
contextual action mode fragement popupMenu等3.0之后才有的概念暂且不提