Android 菜單

菜單的建立並不複雜,關鍵是要能從總體把握菜單的機制。「堅實的框架」宏觀介紹,「詳細說明」對一些關鍵進行說明,「代碼示例」幫助理解。java

一,堅實的框架android

res/menu/**.xml , 資源文件,是建立菜單的一種方式,另外一種是直接用代碼動態添加。網絡

Activity.onCreateOptionsMenu() ,Activity.onCreateContextMenu(),建立選項菜單和上下文菜單的函數,程序啓動時才執行這個函數,因此只能執行一次,若是想更改菜單,要用下一個函數。app

Activity.onPrepareOptionsMenu() ,顯式菜單前執行這個函數。(貌似木有onPrepareContextMenu()函數 !!)。框架

Activity.onMenuItemSelected(),網上處處都在說執行下面兩個函數前先執行這個函數,我試了下,貌似不是這樣的。。。難道我錯了?ide

Activity.onOptionsMenuSelected(),選項菜單的處理。函數

Activity.onContextMenuSelected(),上下文菜單的處理。this

Activity.onOptionsMenuClosed,在選項菜單關閉時被調用。spa

Activity.onContextMenuClosed,在上下文菜單關閉時調用。code

二,詳細說明

1,getMenuInflater().inflate(args);從資源文件建立菜單。

2,menu.add(args);動態建立菜單。

3,item一些重要屬性:

(1).資源文件實現子菜單

子菜單經過在item元素中嵌套menu來實現。

複製代碼
<item android:title="系統設置">
<menu>
<item android:id="@+id/mi_display_setting"
android:title
="顯示設置"/>
<item android:id="@+id/mi_network_setting"
android:title
="網絡設置"/>
<!-- 別的菜單項 -->
</menu>
</item>
複製代碼

(2).爲菜單項添加圖標

<item android:id="@+id/mi_exit"
android:title
="退出"
android:icon
="@drawable/exit"/>

(3).設置菜單項的可選出現

使用android:checkableBehavior設置一組菜單項的可選策略,可選值爲:none, all, single

<group android:id="..."
android:checkableBehavior
="all">
<!-- 菜單項 -->
</group>

使用android:checked設置特定菜單項

<item android:id="..."
android:title
="sometitle"
android:checked
="true"/>

(4).設置菜單項可用/不可用

<item android:id="..."
android:title
="sometitle"
android:enabled
="false"/>

(5).設置菜單項可見/不可見

<item android:id="..."
android:title
="sometitle"
android:visible
="false"/>

三,代碼示例

定義菜單的main.xml資源文件

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <group 
        android:id="@+id/group1">
        <item
            android:id="@+id/item11"
            android:title="item11"></item>
        <item 
            android:id="@+id/item12"
            android:title="item12"></item>
    </group>
    <group 
        android:id="@+id/group2"
        android:checkableBehavior="all" >  <!-- 改組的全部項均可選 -->
        <item
            android:id="@+id/item_21"
            android:title="item21"
            android:visible="false"></item>  <!-- 該項不可見 -->
        <item 
            android:id="@+id/item22"
            android:title="item22"
            android:enabled="false"></item> <!-- 該項不可用 -->
        <item 
            android:id="@+id/item23"
            android:title="item23"
            android:checked="true"></item>  <!-- 該項已被選中 -->
    </group>

</menu>

MainActivity.java文件

 

package com.example.androidtest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button btn = (Button) findViewById(R.id.btn_1);
        btn.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
            public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
            {
                //super.onCreateContextMenu(menu, v, menuInfo);
                CreateMenu(menu);
            }
            
        });
        
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);  // 從xml資源文件建立
        CreateMenu(menu);  // 用代碼動態建立
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log.w("Trace", "onOptionsItemSelected");
        return MenuChoice(item);  
    }
    
    private void CreateMenu(Menu menu)
    {
        MenuItem item1 = menu.add(0, 0, 0, "menu_item_1"); // 用add添加item,返回item
        MenuItem item2 = menu.add(0, 1, 1, "menu_item_2");
        MenuItem item3 = menu.add(0, 2, 2, "menu_item_3");
        MenuItem item4 = menu.add(0, 3, 3, "menu_item_4");
        {
            Intent intent = new Intent(this, MenuActivity.class);
            item4.setIntent(intent);
        }  // 從網上看到說若是不在onOptionsItemSelected()等裏面處理事件,就默認用綁定的事件做響應。可是,這裏沒看到效果
        
    }
    
    private boolean MenuChoice(MenuItem item)
    {
        
        switch( item.getItemId() )
        {
        case 0:
            Toast.makeText(this, "click on menu_item_1", Toast.LENGTH_SHORT).show();
            return true;
        case 1:
            Toast.makeText(this, "click on menu_item_2", Toast.LENGTH_SHORT).show();
            return true;
        case 2:
            Toast.makeText(this, "click on menu_item_3", Toast.LENGTH_SHORT).show();
            return true;
        // 將3的處理使用綁定的活動,可是沒效果,不知爲何??
//        case 3:
//            Toast.makeText(this, "click on menu_item_4", Toast.LENGTH_SHORT).show();
//            return true;
        // 對資源文件中的item的處理方法不少,這裏使用id,值得注意的是這裏的id和用add方法添加的item的id本質相同。
        case R.id.item11:
            Toast.makeText(this, "click on item11 from xml", Toast.LENGTH_SHORT).show(); 
            return true;
        }
        
        return false;
    }
    
//    @Override
//    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
//    {
//        super.onCreateContextMenu(menu, v, menuInfo);
//        CreateMenu(menu);
//    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item)
    {
        Log.w("Trace", "onContextItemSelected");
        switch(item.getItemId() )
        {
        case 0:
            Toast.makeText(this, "menu_item_1 in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 1:
            Toast.makeText(this, "menu_item_2  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 2:
            Toast.makeText(this, "menu_item_3  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        case 3:
            Toast.makeText(this, "menu_item_4  in context menu", Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }


}
相關文章
相關標籤/搜索