安卓開發筆記——Menu菜單組件(選項菜單,上下文菜單,子菜單)


菜單是用戶界面中最常見的元素之一,使用非常頻繁,在Android中,菜單被分為如下三種,選項菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu)。

菜單的實現方式有2種:一種是通過布局文件xml生成菜單,另一種是通過代碼生成。

三種菜單內容有點多,不過大體相似,一次性講完吧,本人偏好代碼動態生成,下面就以代碼為例。

 

1、選項菜單(OptionsMenu)

先來看下選項菜單的效果圖:

 

在一個Activity界面中點擊手機Menu鍵,在屏幕下方彈出的菜單就叫選項菜單(OptionsMenu)。

 

創建一個選項菜單的步驟:
1、覆寫Activity的onCreateOptionsMenu(Menu menu)函數
2、調用menu的add()方法添加菜單項(MenuItem),可以調用MenuItem的setIcon()方法來為菜單設置圖標
3、當菜單項()被選擇時,我們可以通過覆蓋Activity的onOptionsItemSeleted()方法來響應事件

先來了解下主要的方法:

1   public boolean onCreateOptionsMenu(Menu menu)://使用此方法調用OptionsMenu 。
2 
3   public boolean onOptionsItemSelected(MenuItem item)://選中菜單項后發生的動作。
4 
5   public void onOptionsMenuClosed(Menu menu): //菜單關閉后發生的動作。
6 
7   public boolean onPrepareOptionsMenu(Menu menu)://選項菜單顯示之前onPrepareOptionsMenu方法會被調用,你可以用此方法來根據打當時的情況調整菜單。
8 
9   public boolean onMenuOpened(int featureId, Menu menu)://單打開后發生的動作。

下面來看個小Demo,注釋很全。

 1 package com.example.menutest;
 2 
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.Menu;
 7 import android.view.MenuItem;
 8 import android.widget.Toast;
 9 
10 /**
11  * 
12  * @author Balla_兔子
13  * 用代碼動態生成菜單(選項菜單)
14  *
15  */
16 public class MainActivity extends Activity {
17 
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22     }
23     
24     @Override
25     //onCreateOptionsMenu()此方法只會調用一次,即第一次顯示的時候會調用.
26     public boolean onCreateOptionsMenu(Menu menu) {
27 //        MenuItem item1=menu.add(1, 1, 1, "第一個選項菜單");
28 //        item1.setTitle("第一個選項菜單");
29 //        item1.setIcon(R.drawable.ic_launcher);
30         menu.add(1, 1, 1, "第一個選項菜單");
31         menu.add(1, 2, 1, "第二個選項菜單");
32         menu.add(1, 3, 1, "第三個選項菜單");
33         menu.add(1, 4, 1, "第四個選項菜單");        
34         return super.onCreateOptionsMenu(menu);
35     }
36     
37     @Override
38     //如果需要更新菜單項.可以在onPrepareOptionsMenu()方法中操作.
39     public boolean onPrepareOptionsMenu(Menu menu) {
40         Toast.makeText(this, "菜單顯示器前執行的方法", Toast.LENGTH_SHORT).show();
41         return super.onPrepareOptionsMenu(menu);
42     }
43     
44     @Override
45     public void onOptionsMenuClosed(Menu menu) {
46         Toast.makeText(this, "菜單關閉后執行的方法", Toast.LENGTH_SHORT).show();
47         super.onOptionsMenuClosed(menu);
48     }
49     
50     @Override
51     //當菜單被選擇的時候,在OnOptionsItemSelected()方法中實現.
52     public boolean onOptionsItemSelected(MenuItem item) {
53         switch(item.getItemId()){//獲取菜單id
54         case 1:
55             //可以通過Intent跳轉界面
56             Intent intent=new Intent(MainActivity.this, HelloWorld.class);
57             item.setIntent(intent);
58             break;
59         case 2:
60             Toast.makeText(this, "第二個選項菜單被點擊", Toast.LENGTH_SHORT).show();
61             break;
62         case 3:
63             Toast.makeText(this, "第三個選項菜單被點擊", Toast.LENGTH_SHORT).show();
64             break;
65         case 4:
66             Toast.makeText(this, "第四個選項菜單被點擊", Toast.LENGTH_SHORT).show();
67             break;
68         }
69         return super.onOptionsItemSelected(item);
70     }
71 
72 }

 

上面例子中,在創建菜單方法onCreateOptionsMenu()中有個add方法,它的返回值是一個MenuItem,我們可以根據它的返回值來設置更多選擇,例如菜單圖標等。

來看下它的參數,下面是它對應的API文檔中的解釋:參數1:分組,參數2:標示符id,參數3:排序,參數4:菜單文字

 

 

 

2、上下文菜單

國際慣例,先來看下效果圖:

 

 什么是上下文菜單?

Android 的上下文菜單類似於Windows上的右鍵菜單。當為一個視圖注冊了上下文菜單之后,長按(2 秒左右)這個視圖對象就會彈出一個浮動菜單,即上下文菜單。任何視圖都可以注冊上下文菜單,不過,最常見的是用於列表視圖ListView的item。

 

創建上下文菜單步驟:

1、 覆寫 Activity 的 onCreateContenxtMenu() 方法,調用 Menu 的 add 方法添加菜單項(MenuItem)。

2、覆蓋 Activity 的 onContextItemSelected() 方法,響應上下文菜單菜單項的單擊事件。

3、調用 registerForContextMenu() 方法,為視圖注冊上下文菜單。

 

下面直接上個小Demo演示了,對於ListView組件這里就不再給注釋了,不清楚的朋友可以翻下我以前寫的文章。

 1 package com.example.menutest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.ContextMenu;
 6 import android.view.ContextMenu.ContextMenuInfo;
 7 import android.view.Menu;
 8 import android.view.MenuItem;
 9 import android.view.View;
10 import android.widget.ArrayAdapter;
11 import android.widget.ListView;
12 import android.widget.Toast;
13 
14 /**
15  * 
16  * @author Balla_兔子
17  * 用代碼動態生成菜單(上下文菜單)
18  *
19  */
20 public class MainActivity extends Activity  {
21     
22     private ListView listview;
23     private ArrayAdapter<String> adapter;
24     private String info[]={"選項1","選項2","選項3","選項4","選項5","選項6"};
25 
26     @Override
27     protected void onCreate(Bundle savedInstanceState) {
28         super.onCreate(savedInstanceState);
29         setContentView(R.layout.activity_main);
30         //創建一個ListView列表
31         listview=(ListView) findViewById(R.id.listview);
32         adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, info);
33         listview.setAdapter(adapter);
34 
35         
36         //給當前View注冊上下文菜單.
37         this.registerForContextMenu(listview);
38             
39     }
40     
41     @Override
42     public void onCreateContextMenu(ContextMenu menu, View v,
43             ContextMenuInfo menuInfo) {
44             menu.setHeaderTitle("我是上下文菜單");//設置上下文菜單題目
45             menu.setHeaderIcon(R.drawable.ic_launcher);//設置上下文菜單題目圖標
46             menu.add(1, 1, 1, "我是上下文菜單選項1");
47             menu.add(1, 2, 1, "我是上下文菜單選項2");
48             menu.add(1, 3, 1, "我是上下文菜單選項3");
49             menu.add(1, 4, 1, "我是上下文菜單選項4");
50     }
51     
52     @Override
53     public boolean onContextItemSelected(MenuItem item) {
54         switch(item.getItemId()){
55         case 1:
56             Toast.makeText(this, "點擊上下文菜單選項1", Toast.LENGTH_SHORT).show();
57             break;
58         case 2:
59             Toast.makeText(this, "點擊上下文菜單選項2", Toast.LENGTH_SHORT).show();
60             break;
61         case 3:
62             Toast.makeText(this, "點擊上下文菜單選項3", Toast.LENGTH_SHORT).show();
63             break;
64         case 4:
65             Toast.makeText(this, "點擊上下文菜單選項4", Toast.LENGTH_SHORT).show();
66             break;
67         
68         }
69         return super.onContextItemSelected(item);
70     }
71     
72     @Override
73     //關閉上下文菜單觸發此方法
74     public void onContextMenuClosed(Menu menu) {
75         Toast.makeText(this, "關閉上下文菜單", Toast.LENGTH_SHORT).show();
76     }
77     
78 
79     
80 
81 
82 }

 

3、子菜單

先看下效果圖:

 

 

創建子菜單的步驟:
1、 覆寫Activity的onCreateOptionsMenu()方法,調用Menu的addSubMenu()方法來添加子菜單
2、 調用SubMenu的add()方法,添加子菜單項(addSubMenu)
3、 覆寫onOptionsItemSelected()方法,響應子菜單的單擊事件

  子菜單提供了一種自然的組織菜單項的方式,我們可以通過addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的創建和響應子菜單。

 

代碼和之前創建選項菜單,上下文菜單差不多,直接上代碼了:

 1 package com.example.menutest;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.Menu;
 6 import android.view.MenuItem;
 7 import android.view.SubMenu;
 8 import android.widget.Toast;
 9 
10 /**
11  * 
12  * @author Balla_兔子
13  * 用代碼動態生成菜單(子菜單)
14  *
15  */
16 public class MainActivity extends Activity  {
17     
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_main);
23     }
24     
25     @Override
26     public boolean onCreateOptionsMenu(Menu menu) {
27         SubMenu s1=menu.addSubMenu(1, 0, 1, "我是菜單1");
28         s1.setIcon(R.drawable.ic_launcher);//設置子菜單圖標
29         s1.setHeaderTitle("子菜單");//設置子菜單標題
30         s1.add(1, 1, 1, "我是子菜單1");
31         s1.add(1, 2, 1, "我是子菜單2");
32         s1.add(1, 3, 1, "我是子菜單3");
33         s1.add(1, 4, 1, "我是子菜單4");
34         
35         SubMenu s2=menu.addSubMenu(2, 0, 1, "我是菜單2");
36         s2.setIcon(R.drawable.ic_launcher);
37         s2.setHeaderTitle("子菜單");
38         s2.add(2, 1, 1, "我是子菜單(1)");
39         s2.add(2, 2, 1, "我是子菜單(2)");
40         s2.add(2, 3, 1, "我是子菜單(3)");
41         s2.add(2, 4, 1, "我是子菜單(4)");
42         
43         return super.onCreateOptionsMenu(menu);
44     }
45     
46     @Override
47     public boolean onOptionsItemSelected(MenuItem item) {
48         if(item.getGroupId()==1){//判斷分組
49             switch(item.getItemId()){
50             case 1:
51                 Toast.makeText(MainActivity.this, "菜單1的子菜單1被點擊", Toast.LENGTH_SHORT).show();
52                 break;
53             case 2:
54                 Toast.makeText(MainActivity.this, "菜單1的子菜單2被點擊", Toast.LENGTH_SHORT).show();
55                 break;
56             case 3:
57                 Toast.makeText(MainActivity.this, "菜單1的子菜單3被點擊", Toast.LENGTH_SHORT).show();
58                 break;
59             case 4:
60                 Toast.makeText(MainActivity.this, "菜單1的子菜單4被點擊", Toast.LENGTH_SHORT).show();
61                 break;
62             
63         }
64             }else if(item.getGroupId()==2){
65                 switch(item.getItemId()){
66                 case 1:
67                     Toast.makeText(MainActivity.this, "菜單2的子菜單1被點擊", Toast.LENGTH_SHORT).show();
68                     break;
69                 case 2:
70                     Toast.makeText(MainActivity.this, "菜單2的子菜單2被點擊", Toast.LENGTH_SHORT).show();
71                     break;
72                 case 3:
73                     Toast.makeText(MainActivity.this, "菜單2的子菜單3被點擊", Toast.LENGTH_SHORT).show();
74                     break;
75                 case 4:
76                     Toast.makeText(MainActivity.this, "菜單2的子菜單4被點擊", Toast.LENGTH_SHORT).show();
77                     break;
78                 }
79             }
80     
81         return super.onOptionsItemSelected(item);
82     }
83 
84 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM