Android菜單Menu,PopupMenu的使用


選項菜單和子菜單
這裏寫圖片描述
菜單項關聯的Activity
這裏寫圖片描述
上下文菜單
ContextMenu
PopupMenu

選項菜單和子菜單(SubMenu)

Java代碼中定義

Android系統菜單支持接口
Android系統菜單支持接口圖
借用了下網上的圖!如若侵犯到某人的利益,請及時告知,及時刪除!

兩個方法:
add():添加一個新菜單。
addSubMenu:添加一個新的子菜單。

代碼區:

Activity代碼:

public class MainActivity extends Activity
{
	// 定義字體大小菜單項的標識
	final int FONT_10 = 0x111;
	final int FONT_12 = 0x112;
	final int FONT_14 = 0x113;
	final int FONT_16 = 0x114;
	final int FONT_18 = 0x115;
	// 定義普通菜單項的標識
	final int PLAIN_ITEM = 0x11b;
	// 定義字體顏色菜單項的標識
	final int FONT_RED = 0x116;
	final int FONT_BLUE = 0x117;
	final int FONT_GREEN = 0x118;
	private EditText edit;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		edit = (EditText) findViewById(R.id.txt);
	}
	// 當用戶單擊MENU鍵時觸發該方法
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// -------------向menu中添加字體大小的子菜單-------------
		SubMenu fontMenu = menu.addSubMenu("字體大小");
		// 設置菜單的圖標
		fontMenu.setIcon(R.drawable.font);
		// 設置菜單頭的圖標
		fontMenu.setHeaderIcon(R.drawable.font);
		// 設置菜單頭的標題
		fontMenu.setHeaderTitle("選擇字體大小");
		fontMenu.add(0, FONT_10, 0, "10號字體");
		fontMenu.add(0, FONT_12, 0, "12號字體");
		fontMenu.add(0, FONT_14, 0, "14號字體");
		fontMenu.add(0, FONT_16, 0, "16號字體");
		fontMenu.add(0, FONT_18, 0, "18號字體");
		// -------------向menu中添加普通菜單項-------------
		menu.add(0, PLAIN_ITEM, 0, "普通菜單項");
		// -------------向menu中添加文字顏色的子菜單-------------
		SubMenu colorMenu = menu.addSubMenu("字體顏色");
		colorMenu.setIcon(R.drawable.color);
		// 設置菜單頭的圖標
		colorMenu.setHeaderIcon(R.drawable.color);
		// 設置菜單頭的標題
		colorMenu.setHeaderTitle("選擇文字顏色");
		colorMenu.add(0, FONT_RED, 0, "紅色");
		colorMenu.add(0, FONT_GREEN, 0, "綠色");
		colorMenu.add(0, FONT_BLUE, 0, "藍色");
		return super.onCreateOptionsMenu(menu);
	}
	@Override
	// 選項菜單的菜單項被單擊後的回調方法
	public boolean onOptionsItemSelected(MenuItem mi)
	{
		//判斷單擊的是哪個菜單項,並有針對性地作出響應
		switch (mi.getItemId())
		{
			case FONT_10:
				edit.setTextSize(10 * 2);
				break;
			case FONT_12:
				edit.setTextSize(12 * 2);
				break;
			case FONT_14:
				edit.setTextSize(14 * 2);
				break;
			case FONT_16:
				edit.setTextSize(16 * 2);
				break;
			case FONT_18:
				edit.setTextSize(18 * 2);
				break;
			case FONT_RED:
				edit.setTextColor(Color.RED);
				break;
			case FONT_GREEN:
				edit.setTextColor(Color.GREEN);
				break;
			case FONT_BLUE:
				edit.setTextColor(Color.BLUE);
				break;
			case PLAIN_ITEM:
				Toast toast = Toast.makeText(MainActivity.this
						, "您單擊了普通菜單項" , Toast.LENGTH_SHORT);
				toast.show();
				break;
		}
		return true;
	}
}

使用XML文件定義

Activity代碼:

public class MainActivity extends Activity
{
	private TextView txt;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		txt = (TextView) findViewById(R.id.txt);
		// 爲文本框註冊上下文菜單
		registerForContextMenu(txt);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		MenuInflater inflator = new MenuInflater(this);
		//裝填R.menu.my_menu對應的菜單,並添加到menu中
		inflator.inflate(R.menu.menu_main, menu);
		return super.onCreateOptionsMenu(menu);
	}
	// 創建上下文菜單時觸發該方法
	@Override
	public void onCreateContextMenu(ContextMenu menu, View source,
		ContextMenu.ContextMenuInfo menuInfo)
	{
		MenuInflater inflator = new MenuInflater(this);
		//裝填R.menu.context對應的菜單,並添加到menu中
		inflator.inflate(R.menu.context , menu);
		menu.setHeaderIcon(R.drawable.tools);
		menu.setHeaderTitle("請選擇背景色");
	}
	// 上下文菜單中菜單項被單擊時觸發該方法
	@Override
	public boolean onContextItemSelected(MenuItem mi)
	{
		// 勾選該菜單項
		mi.setChecked(true);  // ①
		switch (mi.getItemId())
		{
			case R.id.red:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.RED);
				break;
			case R.id.green:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.GREEN);
				break;
			case R.id.blue:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.BLUE);
				break;
		}
		return true;
	}
	@Override
	// 菜單項被單擊後的回調方法
	public boolean onOptionsItemSelected(MenuItem mi)
	{
		if(mi.isCheckable())
		{
			// 勾選該菜單項
			mi.setChecked(true);  // ②
		}
		//判斷單擊的是哪個菜單項,並有針對性地作出響應
		switch (mi.getItemId())
		{
			case R.id.font_10:
				txt.setTextSize(10 * 2);
				break;
			case R.id.font_12:
				txt.setTextSize(12 * 2);
				break;
			case R.id.font_14:
				txt.setTextSize(14 * 2);
				break;
			case R.id.font_16:
				txt.setTextSize(16 * 2);
				break;
			case R.id.font_18:
				txt.setTextSize(18 * 2);
				break;
			case R.id.red_font:
				txt.setTextColor(Color.RED);
				mi.setChecked(true);
				break;
			case R.id.green_font:
				txt.setTextColor(Color.GREEN);
				mi.setChecked(true);
				break;
			case R.id.blue_font:
				txt.setTextColor(Color.BLUE);
				mi.setChecked(true);
				break;
			case R.id.plain_item:
				Toast toast = Toast.makeText(MainActivity.this
						, "您單擊了普通菜單項", Toast.LENGTH_SHORT);
				toast.show();
				break;
		}
		return true;
	}
}

menu_main.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item android:title="@string/font_size"
		  android:icon="@drawable/font">
		<menu>
			<!-- 定義一組單選菜單項 -->
			<group android:checkableBehavior="single">
				<!-- 定義多個菜單項 -->
				<item
					android:id="@+id/font_10"
					android:title="@string/font_10"/>
				<item
					android:id="@+id/font_12"
					android:title="@string/font_12"/>
				<item
					android:id="@+id/font_14"
					android:title="@string/font_14"/>
				<item
					android:id="@+id/font_16"
					android:title="@string/font_16"/>
				<item
					android:id="@+id/font_18"
					android:title="@string/font_18"/>
			</group>
		</menu>
	</item>
	<!-- 定義一個普通菜單項 -->
	<item android:id="@+id/plain_item"
		  android:title="@string/plain_item">
	</item>
	<item android:title="@string/font_color"
		  android:icon="@drawable/color">
		<menu>
			<!-- 定義一組普通的菜單項 -->
			<group>
				<!-- 定義三個菜單項 -->
				<item
					android:id="@+id/red_font"
					android:title="@string/red_title"/>
				<item
					android:id="@+id/green_font"
					android:title="@string/green_title"/>
				<item
					android:id="@+id/blue_font"
					android:title="@string/blue_title"/>
			</group>
		</menu>
	</item>
</menu>

context.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 定義一組單選菜單項目 -->
	<group android:checkableBehavior="single">
		<!-- 定義三個菜單項 -->
		<item
			android:id="@+id/red"
			android:title="@string/red_title"
			android:alphabeticShortcut="r"/>
		<item
			android:id="@+id/green"
			android:title="@string/green_title"
			android:alphabeticShortcut="g"/>
		<item
			android:id="@+id/blue"
			android:title="@string/blue_title"
			android:alphabeticShortcut="b"/>
	</group>
</menu>

如何菜單項設置關聯Activity

調用setIntent()方法即可,可以把該菜單項與指定的Intent關聯到一起。

public class MainActivity extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// -------------向menu中添加子菜單-------------
		SubMenu prog = menu.addSubMenu("啓動程序");
		// 設置菜單頭的圖標
		prog.setHeaderIcon(R.drawable.tools);
		// 設置菜單頭的標題
		prog.setHeaderTitle("選擇您要啓動的程序");
		// 添加菜單項
		MenuItem item = prog.add("查看Swift");
		//爲菜單項設置關聯的Activity
		item.setIntent(new Intent(this , OtherActivity.class));
		return super.onCreateOptionsMenu(menu);
	}
}

上下文菜單

## 開發上下文菜單的步驟如下:

1:重寫Activity的onCreateContextMenu(Context menu,View source,ContextMenu Context MenuInfo menuInfo)方法:
2:調用Activity的registerForContextMenu(View view)方法爲view組件註冊上下文菜單
3:如果希望應用程序能爲菜單項提供響應,則可以重寫onContextItemSelected(MenuItem mi)方法,或者指定菜單綁定事件監聽器。

代碼區:

Activity代碼:

public class MainActivity extends Activity
{
	// 爲每個菜單定義一個標識
	final int MENU1 = 0x111;
	final int MENU2 = 0x112;
	final int MENU3 = 0x113;
	private TextView txt;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		txt = (TextView) findViewById(R.id.txt);
		// 爲文本框註冊上下文菜單
		registerForContextMenu(txt); 
	}
	// 創建上下文菜單時觸發該方法
	@Override
	public void onCreateContextMenu(ContextMenu menu, View source,
		ContextMenu.ContextMenuInfo menuInfo)
	{
		menu.add(0, MENU1, 0, "紅色");
		menu.add(0, MENU2, 0, "綠色");
		menu.add(0, MENU3, 0, "藍色");
		// 將三個菜單項設爲單選菜單項
		menu.setGroupCheckable(0, true, true);
		//設置上下文菜單的標題、圖標
		menu.setHeaderIcon(R.drawable.tools);
		menu.setHeaderTitle("選擇背景色");
	}
	// 上下文菜單的菜單項被單擊時觸發該方法
	@Override
	public boolean onContextItemSelected(MenuItem mi)
	{
		switch (mi.getItemId())
		{
			case MENU1:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.RED);
				break;
			case MENU2:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.GREEN);
				break;
			case MENU3:
				mi.setChecked(true);
				txt.setBackgroundColor(Color.BLUE);
				break;
		}
		return true;
	}
}

使用PopupMenu創建彈出式菜單

創建步驟:

1:調用PopupMenu(Context context,View anchor)創建下拉菜單,anchor代表要激發彈出菜單組件
2:調用MenuInflate()方法將菜單資源填充到PopupMenu中。
3:調用PopupMenu的show()方法顯示彈出菜單

popup_menu.xml代碼:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
	<item
		android:id="@+id/search"
		android:icon="@android:drawable/ic_menu_search"
		android:title="查找" />
	<item
		android:id="@+id/add"
		android:icon="@android:drawable/ic_menu_add"
		android:title="添加" />
	<item
		android:id="@+id/edit"
		android:icon="@android:drawable/ic_menu_edit"
		android:title="編輯">
		<menu>
			<item
				android:id="@+id/copy"
				android:title="複製" />
			<item
				android:id="@+id/cut"
				android:title="剪切" />			
			<item
				android:id="@+id/paste"
				android:title="粘貼" />			
		</menu>
	</item>
	<item
		android:id="@+id/exit"
		android:title="隱藏菜單" />
</menu>

Activity代碼:

public class MainActivity extends Activity
{
	PopupMenu popup = null;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	public void onPopupButtonClick(View button)
	{
		// 創建PopupMenu對象
		popup = new PopupMenu(this, button);
		// 將R.menu.popup_menu菜單資源加載到popup菜單中
		getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
		// 爲popup菜單的菜單項單擊事件綁定事件監聽器
		popup.setOnMenuItemClickListener(
			new PopupMenu.OnMenuItemClickListener()
			{
				@Override
				public boolean onMenuItemClick(MenuItem item)
				{
					switch (item.getItemId())
					{
						case R.id.exit:
							// 隱藏該對話框
							popup.dismiss();
							break;
						default:
							// 使用Toast顯示用戶單擊的菜單項
							Toast.makeText(MainActivity.this,
								"您單擊了【" + item.getTitle() + "】菜單項"
								, Toast.LENGTH_SHORT).show();
					}
					return true;
				}
			});
		popup.show();
	}
}

有問題歡迎留言,及時回覆。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章