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