Android基础之Menu控件

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之后才有的概念暂且不提

posted @ 2012-02-27 12:11  nightkidzxc  阅读(3113)  评论(0编辑  收藏  举报