Android Menu

参考
Android中Menu的基本用法
Android菜单详解(五)——使用XML生成菜单
Android 菜单(OptionMenu)大全 建立你自己的菜单

在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)

一、OptionsMenu
Paste_Image.png

1.res/menu下的activity_main.xml文件
菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <item
            android:id="@+id/menu_settings"  
            android:orderInCategory="1"  
            android:icon="@drawable/home"  
            android:title="@string/menu_settings"/>  
        <item
            android:id="@+id/menu_about"  
            android:orderInCategory="2"  
            android:icon="@drawable/mine"  
            android:title="@string/menu_about"/>  
        <item
            android:id="@+id/menu_quit"  
            android:orderInCategory="3"  
            android:icon="@drawable/more"  
            android:title="@string/menu_quit"/>  
</menu>

2.MainActivity

package com.example.menutest;  
      
    import android.os.Bundle;  
    import android.app.Activity;  
    import android.view.Menu;  
    import android.view.MenuItem;  
    import android.widget.Toast;  
      
    public class MainActivity extends Activity {  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
        }  
      
        @Override  
        public boolean onCreateOptionsMenu(Menu menu) {  
            // Inflate the menu; this adds items to the action bar if it is present.  
            getMenuInflater().inflate(R.menu.activity_main, menu);  
            return true;//返回true表示显示menu
        }  
      
        @Override  
        public boolean onOptionsItemSelected(MenuItem item) {  
            // TODO Auto-generated method stub  
            switch(item.getItemId()){  
               case R.id.menu_about:             
                   Toast.makeText(MainActivity.this, ""+"关于", Toast.LENGTH_SHORT).show();  
                   break;  
               case R.id.menu_settings:  
                     
                   Toast.makeText(MainActivity.this, ""+"设置", Toast.LENGTH_SHORT).show();  
                   break;  
               case R.id.menu_quit:  
                     
                   Toast.makeText(MainActivity.this, ""+"退出", Toast.LENGTH_SHORT).show();  
                   break;  
               default:  
                   break;  
               } 
               //Toast.makeText(MainActivity.this, ""+item.getItemId(), Toast.LENGTH_SHORT).show();  
          
            return super.onOptionsItemSelected(item);  
        }
    }
public boolean onCreateOptionsMenu(Menu menu):
使用此方法调用OptionsMenu

public boolean onOptionsItemSelected(MenuItem item):
选中菜单项后发生的动作

public void onOptionsMenuClosed(Menu menu):
菜单关闭后发生的动作

public boolean onPrepareOptionsMenu(Menu menu):
选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单

public boolean onMenuOpened(int featureId, Menu menu):
单打开后发生的动作。
二、ContextMenu

参考Android菜单详解(四)——使用上下文菜单ContextMenu
在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重命名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单。

每个文件的操作

上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过registerForContextMenu(View view)来指定。

1.注册上下文菜单

/**
 * 上下文菜单演示Demo
 * 
 * @author CodingMyWorld 2011-8-27 下午03:22:39
 */
publicclass SampleContextMenuActivity extends ListActivity {
    privatestaticfinal String TAG ="SampleContextMenuActivity";

    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 显示列表
        simpleShowList();
        // 为所有列表项注册上下文菜单
        this.registerForContextMenu(getListView());
    }

    privatevoid simpleShowList() {
        // list item
        String[] files =new String[] {
            "文件1",
            "文件2",
            "文件3",
            "文件4"
        };
        // simple array adapter
        ArrayAdapter<String> adapter =new ArrayAdapter<String>(
                this, 
                android.R.layout.simple_list_item_1,
                files);
        // set adapter
        this.setListAdapter(adapter);
        Log.v(TAG, "show simple list");
    }
}

2.生成上下文菜单

@Override
publicvoid onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    Log.v(TAG, "populate context menu");
    // set context menu title
    menu.setHeaderTitle("文件操作");
    // add context menu item
    menu.add(0, 1, Menu.NONE, "发送");
    menu.add(0, 2, Menu.NONE, "标记为重要");
    menu.add(0, 3, Menu.NONE, "重命名");
    menu.add(0, 4, Menu.NONE, "删除");
}

3.响应上下文菜单项

@Override
publicboolean onContextItemSelected(MenuItem item) {
    // 得到当前被选中的item信息
    AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
    Log.v(TAG, "context item seleted ID="+ menuInfo.id);
    
    switch(item.getItemId()) {
    case1:
        // do something
        break;
    case2:
        // do something
        break;
    case3:
        // do something
        break;
    case4:
        // do something
        break;
    default:
        return super.onContextItemSelected(item);
    }
    return true;
}
三、SubMenu

参考Android菜单详解(三)——SubMenu和IconMenu

Paste_Image.png
Paste_Image.png

子菜单提供了一种自然的组织菜单项的方式,它被大量地运用在windows和其他OS的GUI设计中。Android同样支持子菜单,你可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。

@Override
publicboolean onCreateOptionsMenu(Menu menu) {
    int base = Menu.FIRST;
    // 一个menu可以包括多个子菜单
    SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "系统设置");
    // 子菜单可以包括多个菜单项
    MenuItem menuitem1 = subMenu.add(base, base+1, base+1, "显示设置");
    subMenu.add(base, base+2, base+2, "网络设置");
    subMenu.add(base, base+3, base+3, "高级设置");
    subMenu.add(base, base+4, base+4, "安全设置");
    
    // 子菜单项不支持显示图标,这样做是没意义的,尽管不会报错!
    menuitem1.setIcon(R.drawable.displaysettings);
    
    //但是子菜单本身是支持图标的
    subMenu.setIcon(R.drawable.settings);
    
    // 显示菜单请返回true
    return true;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容