Android推薦的三種基本菜單

概述

Google在開發(fā)者網(wǎng)站上關(guān)于Menu的API指南中為開發(fā)者推薦了三種基本的菜單:選項(xiàng)菜單(OptionsMenu)、上下文菜單(ContextMenu)和彈出菜單(PopupMenu)夫偶。下面分別給出相應(yīng)的基本實(shí)現(xiàn)步驟痹兜。

選項(xiàng)菜單(OptionsMenu)

效果圖

實(shí)現(xiàn)步驟:

1辉巡、在res下面創(chuàng)建一個(gè)menu文件夾愉耙,并新建一個(gè)xml文件作為OptionMenu的布局文件。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.android.peter.menudemo.MenuDemoActivity">
    <item
        android:id="@+id/action_1"
        android:orderInCategory="100"
        android:title="Option1"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_2"
        android:orderInCategory="100"
        android:title="Option2"
        app:showAsAction="never" />
    <item
        android:id="@+id/action_3"
        android:orderInCategory="100"
        android:title="Option3"
        app:showAsAction="never" />
</menu>

2琼了、在要顯示OptionMenu的Activity里面重寫onCreateOptionsMenu和onOptionsItemSelected方法谨究。

    //創(chuàng)建菜單恩袱,加載我們之前定義的menu_main.xml布局文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return true;
    }

    //當(dāng)OptionsMenu被選中的時(shí)候處理具體的響應(yīng)事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_1:
                Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_2:
                Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_3:
                Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                return true;
            default:
                //do nothing
        }
        return super.onOptionsItemSelected(item);
    }

上下文菜單(ContextMenu)

效果圖

實(shí)現(xiàn)步驟

1、在res下面創(chuàng)建一個(gè)menu文件夾胶哲,并新建一個(gè)xml文件作為ContextMenu的布局文件(這里我們復(fù)用上面OptionsMenu的布局文件)畔塔。

2、在要顯示ContextMenu的Activity里面重寫onCreateContextMenu和onContextItemSelected方法。

    //創(chuàng)建ContextMenu澈吨,加載我們之前定義的menu_main.xml布局文件
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.menu_main, menu);
    }

    //當(dāng)ContextMenu被選中的時(shí)候處理具體的響應(yīng)事件
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_1:
                Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_2:
                Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_3:
                Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                return true;
            default:
                //do nothing
        }
        return super.onContextItemSelected(item);
    }

3把敢、為控件添加長(zhǎng)按響應(yīng)屬性,并綁定這個(gè)控件谅辣。

為TextView控件添加android:longClickable屬性來響應(yīng)用戶長(zhǎng)按點(diǎn)擊事件修赞。

<TextView
        android:id="@+id/tv_context_menu"
        android:layout_width="160dp"
        android:layout_height="60dp"
        android:padding="20dp"
        android:text="Context Menu"
        android:longClickable="true"
        android:gravity="center"
        />

將View與ContextMenu綁定。

private TextView mContextMenu;
mContextMenu = findViewById(R.id.tv_context_menu);

registerForContextMenu(mContextMenu);

彈出菜單(PopupMenu)

效果圖

實(shí)現(xiàn)流程

1桑阶、在res下面創(chuàng)建一個(gè)menu文件夾柏副,并新建一個(gè)xml文件作為PopupMenu的布局文件(這里我們復(fù)用上面OptionsMenu的布局文件)。

2蚣录、把PopupMenu相關(guān)邏輯封裝到showPopupMenu()方法中割择,包含PopupMenu的實(shí)例化、布局設(shè)置萎河、顯示荔泳、添加MenuItem的點(diǎn)擊監(jiān)聽及響應(yīng)等。

    private void showPopupMenu(){
        PopupMenu popupMenu = new PopupMenu(this,mPopupMenu);
        popupMenu.inflate(R.menu.menu_main);
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()){
                    case R.id.action_1:
                        Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
                        return true;
                    case R.id.action_2:
                        Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
                        return true;
                    case R.id.action_3:
                        Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
                        return true;
                    default:
                        //do nothing
                }

                return false;
            }
        });
        popupMenu.show();
    }

3虐杯、與View綁定玛歌,當(dāng)點(diǎn)擊這個(gè)View的時(shí)候顯示PopupMenu。

View在xml中的布局厦幅。

    <TextView
        android:id="@+id/tv_popup_menu"
        android:layout_width="160dp"
        android:layout_height="60dp"
        android:padding="20dp"
        android:text="Popup Menu"
        android:longClickable="true"
        android:gravity="center"
        android:background="@drawable/background"
        />

綁定View,點(diǎn)擊顯示慨飘。

    private TextView mPopupMenu;
    mPopupMenu = findViewById(R.id.tv_popup_menu);
        mPopupMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showPopupMenu();
            }
        });

小結(jié)

通過比較發(fā)現(xiàn)确憨,前兩種方法實(shí)現(xiàn)起來是比較簡(jiǎn)單的,Activity中已經(jīng)為我們提供了創(chuàng)建和響應(yīng)的回調(diào)方法瓤的,我們只需要在創(chuàng)建菜單時(shí)把布局文件傳遞進(jìn)去休弃,然后在響應(yīng)方法中實(shí)現(xiàn)對(duì)應(yīng)項(xiàng)要做的事就可以了。不像第三種方法需要額外自己去創(chuàng)建實(shí)例并實(shí)現(xiàn)MenuItem的點(diǎn)擊監(jiān)聽圈膏。在默認(rèn)顯示的位置上塔猾,OptionsMenu顯示在右上角ActionBar的位置,ContextMenu能顯示在控件視圖范圍內(nèi)任何被點(diǎn)擊的位置稽坤,PopupMenu與被點(diǎn)擊控件左下角對(duì)齊顯示丈甸。從三種菜單的實(shí)現(xiàn)效果圖可以看出,默認(rèn)的菜單顯示樣式是一樣的尿褪。
菜單的實(shí)現(xiàn)方式不止這三種睦擂,更多的方法可以參看Android中的菜單實(shí)現(xiàn)匯總,開發(fā)者可以根據(jù)自己項(xiàng)目的需要選擇適合自己的方法實(shí)現(xiàn)菜單杖玲。

Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顿仇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臼闻,老刑警劉巖鸿吆,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異述呐,居然都是意外死亡惩淳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門市埋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黎泣,“玉大人,你說我怎么就攤上這事缤谎∈阋校” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坷澡,是天一觀的道長(zhǎng)托呕。 經(jīng)常有香客問我,道長(zhǎng)频敛,這世上最難降的妖魔是什么项郊? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮斟赚,結(jié)果婚禮上着降,老公的妹妹穿的比我還像新娘。我一直安慰自己拗军,他們只是感情好任洞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著发侵,像睡著了一般交掏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃鳄,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天盅弛,我揣著相機(jī)與錄音,去河邊找鬼叔锐。 笑死挪鹏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愉烙。 我是一名探鬼主播狰住,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼齿梁!你這毒婦竟也來了催植?” 一聲冷哼從身側(cè)響起肮蛹,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎创南,沒想到半個(gè)月后伦忠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稿辙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年昆码,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邻储。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赋咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吨娜,到底是詐尸還是另有隱情脓匿,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布宦赠,位于F島的核電站陪毡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勾扭。R本人自食惡果不足惜毡琉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妙色。 院中可真熱鬧桅滋,春花似錦、人聲如沸身辨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栅表。三九已至笋鄙,卻和暖如春师枣,著一層夾襖步出監(jiān)牢的瞬間怪瓶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工践美, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洗贰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓陨倡,卻偏偏與公主長(zhǎng)得像敛滋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兴革,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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