菜單是用戶界面中最常見的元素之一,使用非常頻繁,在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 @Override19 protected void onCreate(Bundle savedInstanceState) {20 super.onCreate(savedInstanceState);21 setContentView(R.layout.activity_main);22 }23 24 @Override25 //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 @Override38 //如果需要更新菜單項.可以在onPrepareOptionsMenu()方法中操作.39 public boolean onPrepareOptionsMenu(Menu menu) {40 Toast.makeText(this, "菜單顯示器前執行的方法", Toast.LENGTH_SHORT).show();41 return super.onPrepareOptionsMenu(menu);42 }43 44 @Override45 public void onOptionsMenuClosed(Menu menu) {46 Toast.makeText(this, "菜單關閉后執行的方法", Toast.LENGTH_SHORT).show();47 super.onOptionsMenuClosed(menu);48 }49 50 @Override51 //當菜單被選擇的時候,在OnOptionsItemSelected()方法中實現.52 public boolean onOptionsItemSelected(MenuItem item) {53 switch(item.getItemId()){//獲取菜單id54 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 @Override27 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 @Override42 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 @Override53 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 @Override73 //關閉上下文菜單觸發此方法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 @Override20 protected void onCreate(Bundle savedInstanceState) {21 super.onCreate(savedInstanceState);22 setContentView(R.layout.activity_main);23 }24 25 @Override26 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 @Override47 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 }
新聞熱點
疑難解答