標籤:
菜單是常用的使用者介面元素,在Android系統裡提供了3種類型的菜單。
(1)選項菜單(options menu):按裝置上Menu 鍵顯示的菜單。
(2)操作功能表(context menu):長按特定介面view顯示,跟具體的 view 綁定在一起,類似PC上滑鼠右鍵菜單。
(3)子功能表(sub menu):以上兩種菜單都可以加入子功能表,但子功能表不能再嵌套子功能表。
下面我們通過一個例子來示範3種菜單的基本用法。
菜單的XML資源檔放在res/menu目錄下。
optionmenu.xml
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
3. <item android:id="@+id/optionitem1"
4. android:icon="@drawable/icon"
5. android:title="選項1" />
6. <item android:id="@+id/optionitem2"
7. android:icon="@drawable/ic_launcher"
8. android:title="選項2" />
9. <item android:id="@+id/optionitem3"
10. android:icon="@drawable/icon"
11. android:title="子功能表" >
12. <menu>
13. <item android:id="@+id/subitem1"
14. android:title="子功能表項1" />
15. <item android:id="@+id/subitem2"
16. android:title="@string/子功能表項2" />
17. </menu>
18. </item>
19. </menu>
在這個菜單資源檔裡,定義了3個功能表項目,id分別為optionitem1、optionitem2和optionitem3。每個功能表項目item有自己的id、title和icon。
第9~18行的optionitem3功能表項目裡除了定義了id、title和icon外,還增加了第12~17行所示的子功能表結構。子功能表的item只有id和title,不能設定icon。
操作功能表資源檔。
contextmenu.xml
1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
3. <item
4. android:id="@+id/contextitem1"
5. android:title="操作功能表子項1">
6. </item>
7. <item
8. android:id="@+id/contextitem2"
9. android:title="操作功能表子項2">
10. </item>
11. <item
12. android:id="@+id/contextitem3"
13. android:title="操作功能表子項3">
14. </item>
15. </menu>
操作功能表的格式和子功能表格式類似,item項沒有icon屬性。
菜單例子的Java原始碼如下。
Mymenu.java
1. @Override
2. public void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.main);
5. GridView gridview;
6. String[] titles={"趙1","錢2","張三","李四","王五"};
7. int buf=R.drawable.sample;
8. int[] resIds={buf,buf,buf,buf,buf};
9. gridview=(GridView)this.findViewById(R.id.gridview);
10. gridview.setAdapter(new MyAdapter(titles,resIds));
11. registerForContextMenu(gridview) ;
12. gridview.setOnItemClickListener(new AdapterView.OnItemClickListener(){
13. ......});}
14. @Override
15. public void onCreateContextMenu(ContextMenu menu,View
v,ContextMenu.ContextMenuInfo menuInfo){
16. super.onCreateContextMenu(menu,v,menuInfo);
17. getMenuInflater().inflate(R.menu.contextmenu,menu);
18. }
19. @Override
20. public boolean onContextItemSelected (MenuItem item) {
21. super.onContextItemSelected(item);
22. switch (item.getItemId()) {
23. case R.id.contextitem1:
24. Toast.makeText(this, "操作功能表子項1", Toast.LENGTH_SHORT).show();
25. break;
26. case R.id.contextitem2:
27. Toast.makeText(this, "操作功能表子項2", Toast.LENGTH_SHORT).show();
28. break;
29. case R.id.contextitem3:
30. Toast.makeText(this, "操作功能表子項3", Toast.LENGTH_SHORT).show();
31. break;
32. default:
33. break;
34. }
35. return super.onOptionsItemSelected(item);
36. }
37. @Override
38. public boolean onCreateOptionsMenu(Menu menu) {
39. super.onCreateOptionsMenu(menu);
40. getMenuInflater().inflate(R.menu.optionmenu, menu);
41. return true;
42. }
43. @Override
44. public boolean onOptionsItemSelected(MenuItem item)
45. {
46. switch (item.getItemId())
47. {
48. case R.id.optionitem1:
49. Toast.makeText(this, "單擊了選項1", Toast.LENGTH_SHORT).show();
50. return true;
51. case R.id.optionitem2:
52. Toast.makeText(this, "單擊了選項2", Toast.LENGTH_SHORT).show();
53. return true;
54. case R.id.optionitem3:
55. Toast.makeText(this, "單擊了選項3", Toast.LENGTH_SHORT).show();
56. return true;
57. case R.id.subitem1:
58. Toast.makeText(this, "單擊子功能表選項1", Toast.LENGTH_SHORT).show();
59. return true;
60. case R.id.subitem2:
61. Toast.makeText(this, "單擊子功能表選項2", Toast.LENGTH_SHORT).show();
62. return true;
63. default:
64. return super.onOptionsItemSelected(item);
65. }}
66. public class MyAdapter extends BaseAdapter {
67. ......}}
第11行registerForContextMenu(gridview),我們為gridview註冊了一個操作功能表,當gridview裡的itemview接收到長按事件時就會彈出一個操作功能表。
第14~18行我們重寫了onCreateContextMenu這個建立操作功能表的回調方法。操作功能表每次觸發顯示時都會調用這個方法。
第17行我們使用getMenuInflater().inflate方法裝載菜單資源XML檔案contextmenu到menu對象裡,這個menu對象是由onCreateContextMenu回呼函數傳入的操作功能表對象。
第19~36行的onContextItemSelected方法是當使用者選擇了操作功能表中的選項時系統回調的方法,系統會傳入使用者選擇的MenuItem對象。通過item.getItemId()我們知道使用者選的功能表項目的id號。在這裡我們用toast顯示使用者的選擇資訊。
第37~42行onCreateOptionsMenu是建立選項菜單的回調方法,系統在第一次建立選項菜單時調用該方法。我們重寫了該方法將菜單資源optionmenu載入到選項菜單。
第43~65行是選項菜單的item響應回呼函數,同樣我們通過item.getItemId()擷取選項id號。
運行10-14、圖10-15、圖10-16和圖10-17所示。
▲圖10-14 選項菜單圖示 ▲圖10-15 單擊選項2後的圖示
▲圖10-16 子功能表圖示 ▲圖10-17 操作功能表圖示
Android菜單—Menu