onCreateOptionsMenu與onCreateContextMenu差異

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

image

image

image

image

相關文章
相關標籤/搜索