Android API指南(二)Menu篇

本文介绍Menu。主要介绍两个方面:Menu的基本用法 以及 在ListView或GridView中长按弹出浮动Menu才当的用法。

Menu的基本用法

点击查看:Menu的基本用法完整代码

注意:由于Menu是显示在ActionBar上的,因此需要在manfest中添加相关主题。例如:

android:theme="@android:style/Theme.Holo.Light.DarkActionBar"

当然,也可以是"@android:style/Theme.Holo"主题。

1. 定义menu菜单

新建res/menu/menu.xml,内容如下:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- search -->
    <item android:id="@+id/search"
          android:icon="@drawable/ic_action_search"
          android:title="@string/search"
          android:showAsAction="ifRoom" />

    <!-- setting -->
    <item android:id="@+id/setting"
          android:title="@string/setting"
          android:showAsAction="ifRoom|withText" />


    <item android:id="@+id/file"
          android:title="@string/file" >            
        <!-- sub menu -->
        <menu>
            <item android:id="@+id/create_new"
                android:title="@string/create_new" />
            <item android:id="@+id/open"
                android:title="@string/open" />
        </menu>
    </item>

</menu>

说明:关于android:showAsAction的基本含义在介绍ActionBar时已经说过了。这里再罗嗦一次。

android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
(01) ifRoom -- 如果有空间,则显示该按钮。
(02) withText -- 显示文本。
(03) never -- 不将该按钮显示在ActionBar上。
(04) always -- 总是将该按钮显示在ActionBar上。
(05) collapseActionView -- 将按钮组合到ActionBar中。

2. 覆盖onCreateOptionsMenu()

在onCreateOptionsMenu()中展开菜单。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu items for use in the action bar
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}   

3. 响应菜单点击事件

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            Toast.makeText(getApplicationContext(), "search", 0).show();
            return true;
        case R.id.setting:
            Toast.makeText(getApplicationContext(), "setting", 0).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }   
}   

悬浮Menu的基本用法

点击查看:悬浮Menu的完整代码

这里以ListView为例,介绍长按ListView中的子项弹出悬浮菜单的方法。

1. 定义Menu配置文件

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- search -->
    <item android:id="@+id/delete"
          android:title="@string/delete"
          android:showAsAction="ifRoom" />

    <!-- setting -->
    <item android:id="@+id/share"
          android:title="@string/share"
          android:showAsAction="ifRoom|withText" />

    <item android:id="@+id/detail"
          android:title="@string/detail"
          android:showAsAction="ifRoom|withText" />

</menu>

2. 调用registerForContextMenu()接口进行菜单注册

registerForContextMenu(listView);

说明:listView是ListView对象。

3. 覆盖onCreateContextMenu()

注意:这里的onCreateContextMenu()和前面的onCreateContextMenu()不一样!它们的参数个数不同!

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);
}   

4. 覆盖onContextItemSelected()

注意:和前面的onOptionsItemSelected()不一样,onContextItemSelected()才是悬浮菜单选择的回调事件!

@Override
public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.delete:
            Toast.makeText(getApplicationContext(), "delete menu", 0).show();
            return true;
        case R.id.share:
            Toast.makeText(getApplicationContext(), "share menu", 0).show();
            return true;
        case R.id.detail:
            Toast.makeText(getApplicationContext(), "detail menu", 0).show();
            return true;

        default:
            return super.onContextItemSelected(item);
    }   
}   
by skywang
Previous     Next