如何使用Menu

如何使用Menu

情境

Menu是一個常用的工具,最常使用的有三種 分別是 Menu、SubMenu 和 ContextMenu。
但是目前這個方法已經很少人在用了,建議透過 Toolbar 來生成 Menu,可以參考 ### 如何在Toolbar使用Menu

如圖右上角的三個點。

程式碼說明

Menu
首先要加入Menu非常簡單
只要在Activity裡面覆寫onCreateOptionsMenu就可以

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return super.onCreateOptionsMenu(menu);
}

仔細看這個方法,它會傳入一個menu,
我們就是利用這個menu來增加我們的Item
只要寫入

menu.add(groupId, itemId, order, title)

可以看到傳入的第一個參數是groupId, 代表你是屬於那一個Group,
通常都會設定為Menu.NONE
第二個參數代表你是Menu Item Id,
第三個參數是你放入Item的順序,
假如你都設為Menu.NONE代表你使用預設, 系統會幫你安排順序
第四個參數就是你想要放入的標題
加入5個item

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    for(int i = 0; i < 5; i++){
  menu.add(Menu.NONE, Menu.FIRST + i, Menu.NONE, "Item " + Integer.toString(i + 1));
 }  
 return super.onCreateOptionsMenu(menu);
}

你就會看到下面的圖示


那要怎麼處理按下Menu Item以後的動作呢?
只要覆寫onOptionsItemSelected這個方法即可

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

它一樣會傳入你點下的Item, 只要你利用Item.getGroupId()方法
就可以處理點下的動作, 例如

@Override
 public boolean onOptionsItemSelected(MenuItem item) {
  if(item.getGroupId() == Menu.NONE) {
   Toast.makeText(getApplicationContext(),
     item.getTitle(),
     Toast.LENGTH_SHORT).show();
  } 
  return super.onOptionsItemSelected(item);
 }

就可以顯示你點下的Item了

SubMenu
跟Menu相同, 只是它用在加入了Menu以後處理變成跳出List再讓你選一次,
先建立Menu第一個Item
然後在建立該Item的SubItem

@Override
public boolean onCreateOptionsMenu(Menu menu) {
 for(int i = 0; i < 5; i++){
  menu.add(Menu.NONE, Menu.FIRST + i, Menu.NONE, "Item " + Integer.toString(i + 1));
 }
 SubMenu subMenu = menu.addSubMenu(3, Menu.FIRST, Menu.NONE, "sub item");
 for(int i = 0; i < 3; i++){
  subMenu.add(Menu.FIRST, Menu.FIRST, Menu.NONE, "Sub Item " + Integer.toString(i + 1));
 }
 return super.onCreateOptionsMenu(menu);
}

這樣就會跳出SubItem的選項了 如下圖


點選下去就會跳到sub item那層

點擊也是相同作法

@Override
public boolean onOptionsItemSelected(MenuItem item) {
 if(item.getGroupId() == Menu.NONE) {
  Toast.makeText(getApplicationContext(),
    item.getTitle(),
    Toast.LENGTH_SHORT).show();
 } else if(item.getGroupId() == Menu.FIRST){
  Toast.makeText(getApplicationContext(),
    item.getTitle(),
    Toast.LENGTH_SHORT).show();
 }
 return super.onOptionsItemSelected(item);
}

顯示點擊的位置

Context Menu
通常這個都是用"長按"當前畫面就會跳出List
如同Menu跟SubMenu一樣
先覆寫onCreateContextMenu

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
}

然後將Item逐一加入menu裡面

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 for(int i = 0; i < 5 ; i++){
  menu.add(5, Menu.FIRST + i, Menu.NONE, "Context menu item "+ i);
 }
 super.onCreateContextMenu(menu, v, menuInfo);
}

再來你要到XML幫Layout加上名稱

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/my_layout"
    >

</LinearLayout>

然後跟Menu不太一樣的是要在onCreate裡面註冊

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    registerForContextMenu(findViewById(R.id.my_layout));
}

這樣你才能在畫面長按的時候跳出List
如下圖

那如果要處理按下的動作
只要覆寫

@Override
public boolean onContextItemSelected(MenuItem item) {
 if(item.getGroupId() == 5){
  Toast.makeText(getApplicationContext(),
    item.getTitle(),
    Toast.LENGTH_SHORT).show();
 }
 return super.onContextItemSelected(item);
}



這樣Menu大概就解說完畢。