大部分的應用程式都包括兩種人機互動方式,一種是直接通過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。