onCreateOptionsMenu只會在啓動時調用一次,而onCreateContextMenu則每次都會調用,這是由於onCreateContextMenu須要爲全部的View控件的上下文菜單服務,可能會在存在多個控件都綁定了上下文的狀況,針對每一個控件的上下文菜單事件都須要即時處理,但Android設計應該有個能夠持久化的方案,從而避免每次都須要從新加載菜單項。java
main.xmlandroid
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="可經過上下文菜單修改背景色" android:textSize="15pt" /> <TextView android:id="@+id/txt2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="可經過上下文菜單修改前景色" android:textSize="15pt" /> </LinearLayout>
my_menu.xmlapp
<?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> <!-- 定義3個菜單項 --> <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.xmlide
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定義一組單選菜單項目 --> <group android:checkableBehavior="single"> <!-- 定義3個菜單項 --> <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>
context2.xml字體
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定義一組單選菜單項目 --> <group android:checkableBehavior="single"> <!-- 定義3個菜單項 --> <item android:id="@+id/white" android:title="@string/white_title" android:alphabeticShortcut="r"/> <item android:id="@+id/black" android:title="@string/black_title" android:alphabeticShortcut="g"/> <item android:id="@+id/gray" android:title="@string/gray_title" android:alphabeticShortcut="b"/> </group> </menu>
strings.xmlui
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, MenuResTest!</string> <string name="app_name">使用XML資源文件定義菜單</string> <string name="red_title">紅色</string> <string name="blue_title">藍色</string> <string name="green_title">綠色</string> <string name="white_title">白色</string> <string name="black_title">黑色</string> <string name="gray_title">灰色</string> <string name="font_size">字體大小</string> <string name="font_color">字體顏色</string> <string name="plain_item">普通菜單項</string> <string name="font_10">10號字體</string> <string name="font_12">12號字體</string> <string name="font_14">14號字體</string> <string name="font_16">16號字體</string> <string name="font_18">18號字體</string> </resources>
MenuResText.javathis
package org.crazyit.ui; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; /** * Description: <br/> * site: <a href="http://www.crazyit.org">crazyit.org</a> <br/> * Copyright (C), 2001-2014, Yeeku.H.Lee <br/> * This program is protected by copyright laws. <br/> * Program Name: <br/> * Date: * * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */ public class MenuResTest extends Activity { private TextView txt,txt2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt = (TextView) findViewById(R.id.txt); txt2 = (TextView) findViewById(R.id.txt2); // 爲文本框註冊上下文菜單 registerForContextMenu(txt); registerForContextMenu(txt2); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflator = new MenuInflater(this); // 狀態R.menu.context對應的菜單,並添加到menu中 inflator.inflate(R.menu.my_menu, menu); return super.onCreateOptionsMenu(menu); } int selectedIndex1 = -1; int selectedIndex2 = -1; // 建立上下文菜單時觸發該方法 @Override public void onCreateContextMenu(ContextMenu menu, View source, ContextMenu.ContextMenuInfo menuInfo) { int vId = source.getId(); MenuInflater inflator = new MenuInflater(this); if (vId == R.id.txt) { // 狀態R.menu.context對應的菜單,並添加到menu中 inflator.inflate(R.menu.context, menu); menu.setHeaderIcon(R.drawable.tools); menu.setHeaderTitle("請選擇背景色"); if (selectedIndex1 >= 0) { menu.getItem(selectedIndex1).setChecked(true); } } else if(vId == R.id.txt2) { // 狀態R.menu.context對應的菜單,並添加到menu中 inflator.inflate(R.menu.context2, menu); menu.setHeaderTitle("請選擇前景色"); if (selectedIndex2 >= 0) { menu.getItem(selectedIndex2).setChecked(true); } } } // 上下文菜單中菜單項被單擊時觸發該方法。 @Override public boolean onContextItemSelected(MenuItem mi) { switch (mi.getItemId()) { case R.id.red: selectedIndex1 = 0; txt.setBackgroundColor(Color.RED); break; case R.id.green: selectedIndex1 = 1; txt.setBackgroundColor(Color.GREEN); break; case R.id.blue: selectedIndex1 = 2; txt.setBackgroundColor(Color.BLUE); break; case R.id.white: selectedIndex2 = 0; txt2.setTextColor(Color.WHITE); break; case R.id.black: selectedIndex2 = 1; txt2.setTextColor(Color.BLACK); break; case R.id.gray: selectedIndex2 = 2; txt2.setTextColor(Color.GRAY); 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(MenuResTest.this, "您單擊了普通菜單項", Toast.LENGTH_SHORT); toast.show(); break; } return true; } }
截圖:spa