菜單是用戶界面中最常見的元素之一,使用非常頻繁,在Android中,菜單被分為如下三種,選項菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu)。
菜單的實現方式有2種:一種是通過布局文件xml生成菜單,另一種是通過代碼生成。
三種菜單內容有點多,不過大體相似,一次性講完吧,本人偏好代碼動態生成,下面就以代碼為例。
1、選項菜單(OptionsMenu)
先來看下選項菜單的效果圖:
在一個Activity界面中點擊手機Menu鍵,在屏幕下方彈出的菜單就叫選項菜單(OptionsMenu)。
先來了解下主要的方法:
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 }