Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android開發之Menu:OptionMenu(選項菜單)、ContextMenu(上下文菜單)、SubMenu(子菜單)

Android開發之Menu:OptionMenu(選項菜單)、ContextMenu(上下文菜單)、SubMenu(子菜單)

編輯:關於android開發

Android開發之Menu:OptionMenu(選項菜單)、ContextMenu(上下文菜單)、SubMenu(子菜單)




菜單的概念,現在已經很普及了。
Windows系統、Mac、桌面版Linux、Java Swing等,都有可視化菜單。
一、Android平台3種菜單
選項菜單(OptionMenu)、上下文菜單(ContextMenu)、子菜單(SubMenu)。


1.Option Menu
一般手機上都會提供Menu的按鈕,對應的就是這個菜單彈出。


主要步驟就是復寫Activity父類中的onCreateOptionMenu(Menu menu)方法,然後通過Menu的add方法來添加菜單進去,
最後,當我們去點擊某項的選項的時候,覆蓋重寫onOptionsItemSelected(MenuItem item)這個方法去實現點擊事件 。


2.Context Menu
上下文菜單,就是和當時的環境(用戶界面、某個流程)相關的菜單。
比如對於文件管理器來說,一些增刪改查就可以擺在ContextMenu中,它其實是實現了一個用戶長按點擊後彈出的來一個菜單。


3.SubMenu
子菜單,在概念上,子菜單可以說是“屬於”以上類型的。

二、理解Android菜單
菜單是許多應用程序不可或缺的一部分,Android中更是如此,所有搭載Android系統的手機甚至都要有一個Menu鍵,由此可見菜單在Android程序中的特殊性。Android SDK提供的菜單有如下幾種:


選項菜單:最常規的菜單,android中把它叫做option menu
子菜單:android中點擊子菜單將彈出懸浮窗口顯示子菜單項。子菜單不支持嵌套,即子菜單中不能再包括其他子菜單。
上下文菜單:android中長按視圖控件後出現的菜單,windows點擊右鍵彈出的菜單即上下文菜單
圖標菜單:這個比較簡單,就是帶icon的菜單項,需要注意的是子菜單項、上下文菜單項、擴展菜單項均無法顯示圖標。
選擇菜單(alternative menu):用的比較少,以後單獨介紹,本文先跳過(其實是我還沒弄明白啦o(≧v≦)o~~)
擴展菜單:選項菜單最多只能顯示6個菜單項,超過6個時,第6個菜單項會被系統替換為一個叫“更多”的子菜單,原來顯示不下的菜單項都作為“更多”菜單的子菜單項。


Android SDK提供的菜單有如下幾種:


選項菜單:最常規的菜單,android中把它叫做option menu
子菜單:android中點擊子菜單將彈出懸浮窗口顯示子菜單項。子菜單不支持嵌套,即子菜單中不能再包括其他子菜單。
上下文菜單:android中長按視圖控件後出現的菜單,windows點擊右鍵彈出的菜單即上下文菜單
圖標菜單:這個比較簡單,就是帶icon的菜單項,需要注意的是子菜單項、上下文菜單項、擴展菜單項均無法顯示圖標。
選擇菜單(alternative menu):用的比較少。(網上找了篇文章,沒有看懂,很陌生的感覺。)
擴展菜單:選項菜單最多只能顯示6個菜單項,超過6個時,第6個菜單項會被系統替換為一個叫“更多”的子菜單,原來顯示不下的菜單項都作為“更多”菜單的子菜單項。


android.view.Menu接口代表一個菜單,android用它來管理各種菜單項。
注意我們一般不自己創建menu,因為每個Activity默認都自帶了一個,我們要做的是為它加菜單項和響應菜單項的點擊事件。
android.view.MenuItem代表每個菜單項,android.view.SubMenu代表子菜單。其三者的關系可以用下圖來表示


每個activity包含一個菜單,一個菜單又能包含多個菜單項和多個子菜單,子菜單其實也是菜單(因為它實現了Menu接口),因此子菜單也可以包含多個菜單項。
SubMenu繼承了Menu的addSubMenu()方法,但調用時會拋出運行時錯誤。
OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了兩個回調方法,用於創建菜單項和響應菜單項的點擊。




三、響應OptionMenu的3種方式
1.重寫activity類的 onOptionsItemSelected(MenuItem)回調方法,每當有菜單項被點擊時,android就會調用該方法,並傳入被點擊菜單項。
publicboolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
//響應每個菜單項(通過菜單項的ID)
case1:
// do something here
break;


default:
//對沒有處理的事件,交給父類來處理
return super.onOptionsItemSelected(item);
}
//返回true表示處理完菜單項的事件,不需要將該事件繼續傳播下去了
return true;
}

這個地方的“default”,我覺得比較好。

/

 

2.使用監聽器
雖然第一種方法是推薦使用的方法,android還是提供了類似java swing的監聽器方式來響應菜單。使用監聽器的方式分為兩步:
//第一步:創建監聽器類
class MyMenuItemClickListener implements OnMenuItemClickListener {
@Override
publicboolean onMenuItemClick(MenuItem item) {
// do something here...
returntrue; //finish handling
}
}


//第二步:為菜單項注冊監聽器
menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());
3.使用Intent響應菜單
第3種方式是直接在MenuItem上調用setIntent(Intent intent)方法,這樣android會自動在該菜單被點擊時調用 startActivity(Intent)。
但是個人認為與其這樣還不如直接在onOptionsItemSelected的case裡手動調用 startActivity(Intent)來的直觀。


個人比較傾向於第1種方式,如果菜單事件代碼比較多,可以考慮第2種方式。
第2種方式的問題是,可能需要傳遞參數到Listener。


四、圖標菜單
// 子菜單項不支持顯示圖標,這樣做是沒意義的,盡管不會報錯!
menuitem1.setIcon(R.drawable.displaysettings);

//但是子菜單本身是支持圖標的
subMenu.setIcon(R.drawable.settings);
菜單的前面可以有個圖標,後文的代碼中,不再具體演示用法。


五、Context Menu
上下文菜單與Options Menu最大的不同在於,Options Menu的擁有者是Activity,而上下文菜單的擁有者是Activity中的View。
每個Activity有且只有一個Options Menu,它為整個Activity服務。
而一個Activity往往有多個View,並不是每個View都有上下文菜單,這就需要我們顯示地通過registerForContextMenu(View view)來指定。


盡管上下文菜單的擁有者是View,生成上下文菜單卻是通過Activity中的onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,
該方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。
兩者的不同在於,onCreateOptionsMenu只在用戶第一次按“Menu”鍵時被調用,而onCreateContextMenu會在用戶每一次長按View時被調用,而且View必須已經注冊了上下文菜單。


另一個值得注意的就是上圖中的ContextMenuInfo,該類的對象被傳入onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法,那麼它有什麼用呢?
有時候,視圖元素需要向上下文菜單傳遞一些信息,比如該View對應DB記錄的ID等,這就要使用ContextMenuInfo。
需要傳遞額外信息的View需要重寫getContextMenuInfo()方法,返回一個帶有數據的ContextMenuInfo實現類對象。


如何創建和響應上下文菜單的3個步驟


1.在activity的onCreate(...)方法中為一個view注冊上下文菜單。


2.在onCreateContextMenuInfo(...)中生成上下文菜單。


3.在onContextItemSelected(...)中響應上下文菜單項。

/
六、代碼示例
需要說明的是,Option Menu,按左鍵菜單或者右鍵菜單按鈕,彈出菜單。
Context Menu,長按View,彈出菜單。


OptionMenu代碼
package cn.fansunion.menu;


import cn.fansunion.R;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.Toast;


/**
 * ①:直接去覆蓋public boolean onCreateOptionsMenu(Menu menu) { code......},
 * 這個方法,需要注意的是,這個方法如果覆蓋的了,只會被創建一次,也就是說, 選項菜單只會去被實例化一次,之後就不會被去調用了
 * ②:調用Menu中的add()方法,來添加每一個菜單選項, add(groupId, itemId, order, titleRes) group:
 * 選項組號,一般都設置成0就OK啦 itenId: 選項的Id 很重要 order:順序,一般來說都設置0就行了 titelRes: 選項的標題名字
 * ③:當我們去點擊某項的選項的時候,覆蓋重寫onOptionsItemSelected(MenuItem item)這個方法去實現點擊事件.
 */
public class OptionMenuActivity extends Activity {
	// 點擊菜單選項的常量Id
	private static final int MENU_ONE = 1;
	private static final int MENU_TWO = 2;
	private static final int MENU_THREE = 3;
	private int MENU_SUB = 11;
	private static final  int GROUP_ZERO = 0;
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.option_menu);


	}


	/**
	 * @param group
	 *            : 選項組號,一般都設置成0就OK啦
	 * @param itenId
	 *            : 選項的Id 很重要
	 * @param order
	 *            :順序,一般來說都設置0就行了
	 * @param titelRes
	 *            : 選項的標題名字
	 */
	public boolean onCreateOptionsMenu(Menu menu) {	
		menu.add(GROUP_ZERO, MENU_ONE, GROUP_ZERO, 小雷);
		// 一個menu可以包括多個子菜單
		SubMenu subMenu=menu.addSubMenu(GROUP_ZERO, MENU_SUB, GROUP_ZERO, 小雷興趣);
		subMenu.add(GROUP_ZERO, MENU_TWO, GROUP_ZERO, 互聯網技術);
		subMenu.add(GROUP_ZERO, MENU_THREE, GROUP_ZERO, 投資理財);
		return true;


	}


	/**
	 * 
	 * @param item
	 *            .getItemId() 獲取被點擊的Id
	 */
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case MENU_ONE:
			Toast.makeText(this, 你點擊了Menu1, Toast.LENGTH_LONG).show();
			break;
		case MENU_TWO:
			Toast.makeText(this, 你點擊了Menu2, Toast.LENGTH_LONG).show();
			break;
		case MENU_THREE:
			Toast.makeText(this, 你點擊了Menu3, Toast.LENGTH_LONG).show();
			break;
		
		default:
			return super.onOptionsItemSelected(item);
		}
		return true;
	}
}


布局文件layout
option_menu.xml
  
  
      
   
  

/

ContextMenu代碼
package cn.fansunion.menu;
import cn.fansunion.R;
import android.app.Activity;  
import android.os.Bundle;  
import android.view.ContextMenu;  
import android.view.ContextMenu.ContextMenuInfo;  
import android.view.MenuItem;  
import android.view.View;  
import android.widget.TextView;  
import android.widget.Toast;  
  
public class ContextMenuActivity extends Activity {  
    private static final int GROUP = 0;
	private static final int MENU_ONE = 1;  
    private static final int MENU_TWO = 2;  
    private static final int MENU_THREE = 3;  
  
    private TextView contextView;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.context_menu);  
        contextView = (TextView) this.findViewById(R.id.contextMenu);  
        registerForContextMenu(contextView);  
    }  
  
    @Override  
    public void onCreateContextMenu(ContextMenu menu, View v,  
            ContextMenuInfo menuInfo) {  
        super.onCreateContextMenu(menu, v, menuInfo);  
        menu.add(GROUP, MENU_ONE, 0, 小雷FansUnion);  
        menu.add(GROUP, MENU_TWO, 0, 互聯網技術);  
        menu.add(GROUP, MENU_THREE, 0, 投資理財);  
    }  
  
    @Override  
    public boolean onContextItemSelected(MenuItem item) {  
        switch (item.getItemId()) {  
        case MENU_ONE:  
            Toast.makeText(this, 你 點擊的是Menu1, Toast.LENGTH_LONG).show();  
            contextView.setText(你點擊的是Menu1);  
            break;  
  
        case MENU_TWO:  
            Toast.makeText(this, 你點擊的是Menu2, Toast.LENGTH_LONG).show();  
            contextView.setText(你點擊的是Menu2);  
            break;  
        case MENU_THREE:  
            Toast.makeText(this, 你點擊的是Menu3, Toast.LENGTH_LONG).show();  
            contextView.setText(你點擊的是Menu3);  
            break;  
        }  
        return true;  
    }  
}  




布局layout
context_menu.xml


	   
	

/
注:本文主要是根據以下3個地方的參考資料,簡化和優化了文字和代碼,改造而來的。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved