Android之Menu菜單詳解

本節(jié)引言:

本章給大家?guī)?lái)的是Android中的Menu(菜單),而在Android中的菜單有如下幾種:

  • OptionMenu:選項(xiàng)菜單他巨,android中最常見(jiàn)的菜單,通過(guò)Menu鍵來(lái)調(diào)用
  • SubMenu:子菜單,android中點(diǎn)擊子菜單將彈出一個(gè)顯示子菜單項(xiàng)的懸浮框亿遂, 子菜單不支持嵌套卖局,即不能包括其他子菜單
  • ContextMenu:上下文菜單斧蜕,通過(guò)長(zhǎng)按某個(gè)視圖組件后出現(xiàn)的菜單,該組件需注冊(cè)上下文菜單 本節(jié)我們來(lái)依依學(xué)習(xí)這幾種菜單的用法~

1.OptionMenu(選項(xiàng)菜單)

1)如何使用OptionMenu砚偶?

答:非常簡(jiǎn)單批销,重寫(xiě)兩個(gè)方法就好,其實(shí)這兩個(gè)方法我們?cè)趧?chuàng)建項(xiàng)目的時(shí)候就會(huì)自動(dòng)生成~ 他們分別是:

  • public boolean onCreateOptionsMenu(Menu menu):調(diào)用OptionMenu染坯,在這里完成菜單初始化

  • public boolean onOptionsItemSelected(MenuItem item):菜單項(xiàng)被選中時(shí)觸發(fā)均芽,這里完成事件處理

當(dāng)然除了上面這兩個(gè)方法我們可以重寫(xiě)外我們還可以重寫(xiě)這三個(gè)方法:

  • public void onOptionsMenuClosed(Menu menu):菜單關(guān)閉會(huì)調(diào)用該方法

  • public boolean onPrepareOptionsMenu(Menu menu):選項(xiàng)菜單顯示前會(huì)調(diào)用該方法, 可在這里進(jìn)行菜單的調(diào)整(動(dòng)態(tài)加載菜單列表)

  • public boolean onMenuOpened(int featureId, Menu menu):選項(xiàng)菜單打開(kāi)以后會(huì)調(diào)用這個(gè)方法

而加載菜單的方式有兩種单鹿,一種是直接通過(guò)編寫(xiě)菜單XML文件掀宋,然后調(diào)用:

(1)getMenuInflater().inflate(R.menu.menu_main, menu);

(2)加載菜單 或者通過(guò)代碼動(dòng)態(tài)添加,onCreateOptionsMenu的參數(shù)menu仲锄,調(diào)用add方法添加 菜單劲妙,add(菜單項(xiàng)的組號(hào),ID儒喊,排序號(hào)镣奋,標(biāo)題),另外如果排序號(hào)是按添加順序排序的話都填0即可怀愧!

2)使用示例:

運(yùn)行效果圖

代碼實(shí)現(xiàn)
MainActivity.java

public class MainActivity extends AppCompatActivity {

    //1.定義不同顏色的菜單項(xiàng)的標(biāo)識(shí):
    final private int RED = 110;
    final private int GREEN = 111;
    final private int BLUE = 112;
    final private int YELLOW = 113;
    final private int GRAY= 114;
    final private int CYAN= 115;
    final private int BLACK= 116;

    private TextView tv_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_test = (TextView) findViewById(R.id.tv_test);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        menu.add(1,RED,4,"紅色");
        menu.add(1,GREEN,2,"綠色");
        menu.add(1,BLUE,3,"藍(lán)色");
        menu.add(1,YELLOW,1,"黃色");
        menu.add(1,GRAY,5,"灰色");
        menu.add(1,CYAN,6,"藍(lán)綠色");
        menu.add(1,BLACK,7,"黑色");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        switch (id){
            case RED:
                tv_test.setTextColor(Color.RED);
                break;
            case GREEN:
                tv_test.setTextColor(Color.GREEN);
                break;
            case BLUE:
                tv_test.setTextColor(Color.BLUE);
                break;
            case YELLOW:
                tv_test.setTextColor(Color.YELLOW);
                break;
            case GRAY:
                tv_test.setTextColor(Color.GRAY);
                break;
            case CYAN:
                tv_test.setTextColor(Color.CYAN);
                break;
            case BLACK:
                tv_test.setTextColor(Color.BLACK);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

代碼分析
上述的代碼非常簡(jiǎn)單唆途,給大家演示了Android 5.0的中OptionMenu(選項(xiàng)菜單)中動(dòng)態(tài)添加菜單富雅, 以及事件處理,根據(jù)id判斷用戶點(diǎn)擊的是哪一項(xiàng)肛搬,然后執(zhí)行對(duì)應(yīng)的操作没佑! 另外,有一點(diǎn)要注意的是温赔,選項(xiàng)菜單經(jīng)過(guò)了三個(gè)階段的過(guò)渡: 在Android 2.3.x或者更低版本蛤奢,因?yàn)樵撾A段大部分的機(jī)型都是帶有Menu鍵的, 此階段通過(guò)點(diǎn)擊Menu鍵彈出菜單:

而在Android 3.0或者更高的版本陶贼,則是通過(guò)3.0引入的ActionBar中的setting菜單:

而在5.0以上的版本則是在ToolBar中的啤贩,點(diǎn)擊后出一個(gè)溢出式的菜單樣式

另外通過(guò)XML方式定義Menu的方式,我們貼個(gè)簡(jiǎn)單的參考代碼:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/new_game"
          android:icon="@drawable/ic_new_game"
          android:title="@string/new_game"
          android:showAsAction="ifRoom"/>
    <item android:id="@+id/help"
          android:icon="@drawable/ic_help"
          android:title="@string/help" />
</menu>

2.ContextMenu(上下文菜單)

一開(kāi)始我們就說(shuō)了拜秧,長(zhǎng)按某個(gè)View后出現(xiàn)的菜單痹屹,我們需要為這個(gè)View注冊(cè)上下文菜單!

1)如何使用ContextMenu枉氮?

答:使用的流程如下:
Step 1:重寫(xiě)onCreateContextMenu()方法
Step 2:為view組件注冊(cè)上下文菜單志衍,使用registerForContextMenu()方法,參數(shù)是View
Step 3:重寫(xiě)onContextItemSelected()方法為菜單項(xiàng)指定事件監(jiān)聽(tīng)器

上面的OptionMenu我們使用了Java代碼的方法來(lái)完成菜單項(xiàng)的添加,這里我們就用XML文件的 方式來(lái)生成我們的CotnextMenu吧聊替,另外關(guān)于使用Java代碼來(lái)生成菜單還是使用XML來(lái)生成菜單楼肪, 建議使用后者來(lái)定義菜單,這樣可以減少Java代碼的代碼臃腫惹悄,而且不用每次都用代碼分配 id春叫,只需修改XML文件即可修改菜單的內(nèi)容,這樣在一定程度上位程序提供的了更好的解耦泣港, 低耦合暂殖,高內(nèi)聚,是吧~
2)使用示例:
運(yùn)行效果圖

實(shí)現(xiàn)代碼
我們先來(lái)編寫(xiě)選項(xiàng)菜單的菜單XML文件:
menu_context.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 定義一組單選按鈕 -->
    <!-- checkableBehavior的可選值由三個(gè):single設(shè)置為單選当纱,all為多選呛每,none為普通選項(xiàng) -->
    <group android:checkableBehavior="none">
        <item android:id="@+id/blue" android:title="@string/font_blue"/>
        <item android:id="@+id/green" android:title="@string/font_green"/>
        <item android:id="@+id/red" android:title="@string/font_red"/>
    </group>
</menu>

接著我們?cè)谶x項(xiàng)菜單的那個(gè)基礎(chǔ)上,添加一個(gè)TextView惫东,然后加上下面一些東西:

private TextView tv_context;
tv_context = (TextView) findViewById(R.id.tv_context);
        registerForContextMenu(tv_context);

    //重寫(xiě)與ContextMenu相關(guān)方法
    @Override
    //重寫(xiě)上下文菜單的創(chuàng)建方法
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_context, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //上下文菜單被點(diǎn)擊是觸發(fā)該方法
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.blue:
                tv_context.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                tv_context.setTextColor(Color.GREEN);
                break;
            case R.id.red:
                tv_context.setTextColor(Color.RED);
                break;
        }
        return true;
    }

好的莉给,就是那么簡(jiǎn)單可以為多個(gè)View設(shè)置上下文毙石,switch(v.getId)你懂的 另外廉沮,和等下要講的子菜單一樣,上下文菜單都無(wú)法顯示圖標(biāo)徐矩!

3.SubMenu(子菜單)

所謂的子菜單只是在<item>中又嵌套了一層<menu>而已
代碼示例:
運(yùn)行效果圖

實(shí)現(xiàn)代碼:
編寫(xiě)子菜單的Menu文件:menu_sub.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/submenu" android:title="子菜單使用演示~">
        <menu>
            <group android:checkableBehavior = "none">
                <item android:id="@+id/one" android:title = "子菜單一"/>
                <item android:id="@+id/two" android:title = "子菜單二"/>
                <item android:id="@+id/three" android:title = "子菜單三"/>
            </group>
        </menu>
    </item>
</menu>

接著我們改下上面上下文菜單的兩個(gè)方法的內(nèi)容滞时,換上下面的代碼:

public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        //子菜單部分:
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.menu_sub, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
}

public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
            case R.id.one:
                Toast.makeText(MainActivity.this,"你點(diǎn)擊了子菜單一",Toast.LENGTH_SHORT).show();
                break;
            case R.id.two:
                item.setCheckable(true);
                Toast.makeText(MainActivity.this,"你點(diǎn)擊了子菜單二",Toast.LENGTH_SHORT).show();
                break;
            case R.id.three:
                Toast.makeText(MainActivity.this,"你點(diǎn)擊了子菜單三",Toast.LENGTH_SHORT).show();
                item.setCheckable(true);
                break;
        }
    return true;
}

好的,灰常簡(jiǎn)單是吧滤灯,另外坪稽,如果你想在Java代碼中添加子菜單的話曼玩,可以調(diào)用addSubMenu()
比如:SubMenu file = menu.addSubMenu("文件");file還需要addItem添加菜單項(xiàng)哦!

4.PopupMenu(彈出式菜單)

一個(gè)類似于PopupWindow的東東窒百,他可以很方便的在指定View下顯示一個(gè)彈出菜單黍判,而且 他的菜單選項(xiàng)可以來(lái)自于Menu資源,下面我們寫(xiě)個(gè)簡(jiǎn)單的例子來(lái)使用下這個(gè)東東~
使用示例:
運(yùn)行效果圖:

實(shí)現(xiàn)代碼:
菜單資源文件:menu_pop.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/lpig" android:title="小豬" />
    <item android:id="@+id/bpig" android:title="大豬" />
</menu>

在布局中添加一個(gè)按鈕篙梢,然后添加點(diǎn)擊事件:
MainActivity.java:

btn_show_menu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(MainActivity.this,btn_show_menu);
                popup.getMenuInflater().inflate(R.menu.menu_pop, popup.getMenu());
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()){
                            case R.id.lpig:
                                Toast.makeText(MainActivity.this,"你點(diǎn)了小豬~",
                                Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.bpig:
                                Toast.makeText(MainActivity.this,"你點(diǎn)了大豬~",
                                Toast.LENGTH_SHORT).show();
                                break;
                        }
                        return true;
                    }
                });
                popup.show();
            }
        });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顷帖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子渤滞,更是在濱河造成了極大的恐慌贬墩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妄呕,死亡現(xiàn)場(chǎng)離奇詭異陶舞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绪励,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肿孵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人优炬,你說(shuō)我怎么就攤上這事颁井。” “怎么了蠢护?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵雅宾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我葵硕,道長(zhǎng)眉抬,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任懈凹,我火速辦了婚禮蜀变,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘介评。我一直安慰自己库北,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布们陆。 她就那樣靜靜地躺著寒瓦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坪仇。 梳的紋絲不亂的頭發(fā)上杂腰,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音椅文,去河邊找鬼喂很。 笑死惜颇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的少辣。 我是一名探鬼主播凌摄,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼漓帅!你這毒婦竟也來(lái)了望伦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤煎殷,失蹤者是張志新(化名)和其女友劉穎屯伞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豪直,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劣摇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弓乙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末融。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖暇韧,靈堂內(nèi)的尸體忽然破棺而出勾习,到底是詐尸還是另有隱情,我是刑警寧澤懈玻,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布巧婶,位于F島的核電站,受9級(jí)特大地震影響涂乌,放射性物質(zhì)發(fā)生泄漏艺栈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一湾盒、第九天 我趴在偏房一處隱蔽的房頂上張望湿右。 院中可真熱鬧,春花似錦罚勾、人聲如沸毅人。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丈莺。三九已至,卻和暖如春分衫,著一層夾襖步出監(jiān)牢的瞬間场刑,已是汗流浹背般此。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蚪战, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牵现,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓邀桑,卻偏偏與公主長(zhǎng)得像瞎疼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壁畸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容