回顧前面的幾篇,我們都是直接在代碼中添加功能表項目,給功能表項目分組等,這是比較傳統的做法,它存在著一些不足。比如說,為了響應每個功能表項目,我們需要用常量來儲存每個功能表項目的ID等。為此,Android提供了一種更好的方式,就是把menu也定義為應用程式的資源,通過android對資源的本地支援,使我們可以更方便地實現菜單的建立與響應。這一篇就介紹如何使用XML檔案來載入和響應菜單,我們需要做這幾步:
- 在/res目錄下建立menu檔案夾
- 在menu目錄下使用與menu相關的元素定義xml檔案,檔案名稱是隨意的,android會自動為其產生資源ID。例如:R.menu.mainmenu對應menu目錄的mainmenu.xml資源檔
- 使用xml檔案的資源ID,將xml檔案中定義的功能表項目添加到menu對象中
- 響應功能表項目時,使用每個功能表項目對應的資源ID
下面就使用xml的方式完成《Android菜單詳解(二)——建立並響應選項菜單》中的options menu。
定義菜單資源檔
在res目錄下建立menu檔案夾,在menu下建立一個xml資源檔,我這裡叫做mainmenu.xml
編寫mainmenu.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- group1 -->
<group android:id="@+id/group1">
<item android:id="@+id/mi1"
android:title="item1"/>
<item android:id="@+id/mi2"
android:title="item2"/>
</group>
<!-- group 2 -->
<group android:id="@+id/group2">
<item android:id="@+id/mi3"
android:title="item3"/>
<item android:id="@+id/mi4"
android:title="item4"/>
</group>
</menu>
這裡簡單的添加了4個功能表項目,並將其分為2組。item元素的android:title值可以引用values中的string資源。
使用MenuInflater添加功能表項目
inflater在android中建立了從資源檔到對象的橋樑,MenuInflater即把菜單xml資源轉換為對象並添加到menu對象中,它可以通過activity的getMenuInflater()得到。我們在MainActivity中重寫onCreateOptionsMenu(...)方法。
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, menu);
returntrue;
}
響應功能表項目
最後重寫onOptionsItemSeleted(...)方法。
@Override
publicboolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.mi1:
// do sth
break;
case R.id.mi2:
// do sth
break;
case R.id.mi3:
// do sth
break;
case R.id.mi4:
// do sth
break;
}
returntrue;
}
這一步最大的體現了使用XML產生菜單的好處。android不僅為我們定義的xml檔案產生了資源ID,同樣可以為group,menu item來自動產生ID(就像為布局中定義的view產生id那樣)。這樣功能表項目ID的建立與管理就不用我們操心了,全部交給android去做吧!
至此,我們完成了一個簡單的“使用XML產生菜單”的demo,並從中體會到了使用資源檔的好處,因此這是android中建立菜單的推薦方式。實際上,我們在代碼中對功能表項目或分組的操作都能在xml檔案中完成,下面就簡單介紹一些比較常用的功能。(Google提供的API demos中有最全面的樣本)
更多菜單資源檔的功能
1.資源檔實現子功能表
子功能表通過在item元素中嵌套menu來實現。
<item android:title="系統設定">
<menu>
<item android:id="@+id/mi_display_setting"
android:title="顯示設定"/>
<item android:id="@+id/mi_network_setting"
android:title="網路設定"/>
<!-- 別的功能表項目 -->
</menu>
</item>
2.為功能表項目添加表徵圖
<item android:id="@+id/mi_exit"
android:title="退出"
android:icon="@drawable/exit"/>
3.設定功能表項目的可選出現
使用android:checkableBehavior設定一組功能表項目的可選策略,可選值為:none, all, single
<group android:id="..."
android:checkableBehavior="all">
<!-- 功能表項目 -->
</group>
使用android:checked設定特定功能表項目
<item android:id="..."
android:title="sometitle"
android:checked="true"/>
4.設定功能表項目可用/不可用
<item android:id="..."
android:title="sometitle"
android:enabled="false"/>
5.設定功能表項目可見/不可見
<item android:id="..."
android:title="sometitle"
android:visible="false"/>
結語
本篇是Android菜單詳解系列的最後一篇,本系列詳細介紹了android中各種常用菜單的提示和注意事項,希望能協助大家更好的理解,也期待與各位交流開發中的心得:)