android menu的兩種實現方法

來源:互聯網
上載者:User

大部分的應用程式都包括兩種人機互動方式,一種是直接通過GUI的 Views,其可以滿足大部分的互動操作。另外一種是應用Menu,當按下Menu按鈕後,會彈出與當前活動狀態下的應用程式相匹配的菜單。

這兩種方式相比較都有各自的優勢,而且可以很好的相輔相成,即便使用者可以由主介面完成大部分操作,但是適當的拓展Menu功能可以更加完善應用程式,至少使用者可以通過排列整齊的 按鈕清晰的瞭解當前模式下可以使用的功能。
有兩種方法可以為Android APPs添加菜單功能,下邊將對設定過程給出詳細的介紹:
第一種方法,通過Layout來添加靜態菜單元素。
一般情況下,開發人員在res/Layout路徑下來定義應用程式的GUI。應用Eclipse建立一個新項目後,可以看到res/layout中存在一個 預置的main.xml檔案,其作為程式預設啟動介面。同樣,可以通過這種方式 建立一個靜態Menu,建立方法參閱下邊的原始碼:
?View Code XML

<?xml version="1.0" encoding="utf-8"?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item   
        android:id="@+id/previous"   
        android:title="@string/previous"   
        android:enabled="false"  
        android:icon="@android:drawable/ic_media_previous"/>  
        <!--these may not be available in next api (level > 3), so be carefull-->  
    <item   
        android:id="@+id/play_pause"   
        android:title="@string/play"   
        android:icon="@android:drawable/ic_media_play"/>  
    <item   
        android:id="@+id/next"   
        android:title="@string/next"   
        android:icon="@android:drawable/ic_menu_next"/>  
</menu>

在Activity類中調用剛剛建立的Menu,首先將當前的Activity與指定的Menu XML相關聯:
1.@Override
2.public boolean onCreateOptionsMenu(Menu menu) {
3.    super.onCreateOptionsMenu(menu);
4.    getMenuInflater().inflate(R.layout.player_menu, menu);
5.    return true;
6.}

實現onOptionsItemSelected方法: (其目的是捕捉到菜單觸發事件後,對具體觸發的選項作出響應,實際調用的函數包含在各自的case中)
01.@Override
02.public boolean onOptionsItemSelected(MenuItem item) {
03.    switch (item.getItemId()) {
04.    case R.id.previous:
05.        previous(); //go to previous song in the playlist
06.        return true;
07.    case R.id.play_pause:
08.        isPlaying() ? pause() : play(); //toggle play/pause
09.        return true;
10.    case R.id.next:
11.        next(); //go to next song in the playlist
12.        return true;
13.    }
14.    return false; //should never happen
15.}

最後可以通過onPrepareOptionMenu方法初始化Menu Items的屬性:
01.@Override
02.public boolean onPrepareOptionsMenu(Menu menu) {
03.    //set play_pause menu item look
04.    if(isPlaying()) {
05.        menu
06.            .findItem(R.id.play_pause)
07.            .setTitle(R.string.pause)
08.            .setIcon(android.R.drawable.ic_media_pause);
09.    } else {
10.        menu
11.            .findItem(R.id.play_pause)
12.            .setTitle(R.string.play)
13.            .setIcon(android.R.drawable.ic_media_play);
14.    }
15.    return true;
16.}

大部分程式都通過這種方式添加Menu菜單功能,而且通過以上的步驟來看,其實現方法非常簡單。
第二種方法,在Activity類中動態建立Menu。
首先需要定義Menu Item識別序號:
1.public static final MENU_PREVIOUS = 0; //no more R.ids
2.public static final MENU_PLAY_PAUSE = 1;
3.public static final MENU_NEXT = 2;

實現onCreateOptionMenu()方法:(第一種方法中已經通過xml定義了現成的Menu結構,所以不需要應用這個方法)
01.@Override
02.public boolean onCreateOptionsMenu(Menu menu) {
03.    menu
04.        .add(0, MENU_PREVIOUS, 0, R.string.previous)
05.        .setIcon(android.R.drawable.ic_media_previous);
06.    menu
07.        .add(0, MENU_PLAY_PAUSE, 0, R.string.play)
08.        .setIcon (android.R.drawable.ic_media_play);
09.    menu
10.        .add(0, MENU_NEXT, 0, R.string.next)
11.        .setIcon(android.R.drawable.ic_media_next);
12.    return true;
13.}

引用與第一種方法相同的方式來捕捉菜單的行為:
01.@Override
02.public boolean onOptionsItemSelected(MenuItem item) {
03.    switch (item.getItemId()) {
04.    case MENU_PREVIOUS:
05.        previous(); //go to previous song in the playlist
06.        return true;
07.    case MENU_PLAY_PAUSE:
08.        isPlaying() ? pause() : play(); //toggle play/pause
09.        return true;
10.    case MENU_NEXT:
11.        next(); //go to next song in the playlist
12.        return true;
13.    }
14.    return false; //should never happen
15.}

————
對以上兩種方法的補充:
根據需要設定不同Menu Item的屬性:
1.menu.findItem(R.id.next).setEnabled(false);

設定Menu Item從屬關係(添加子父層級):
直接寫在方法中:
1.menu
2.        .addSubMenu(R.id.repeat)
3.        .add(R.id.one)
4.        .add(R.id.all)
5.        .add(R.id.none);

直接定義在XML Layout中:
?View Code XML

<item android:id="@+id/repeat" android:title="@string/repeat">  
<menu>  
    <item android:id="@+id/one" android:title="@string/repeat_one"></item>  
    <item android:id="@+id/all" android:title="@string/repeat_all"></item>  
    <item android:id="@+id/none" android:title="@string/repeat_none"></item>  
</menu>

————
這兩種不同的方法實現的目的是一樣的,而且不存在本質上的卻別,具體根據實際情況(根據項目的結構需要或者團隊開發標準)選擇合適的方法來建立Menu。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.