2011-11-04

在 Android 使用 SubMenu

SubMenu 與 MenuItem 在 Java 裡是沒有關係的,但是他們相當類似的行為可以從 Menu 加入 MenuItem 與 SubMenu 的 API 看出來:
MenuItem add(int groupId, int itemId, int order, CharSequence title);
SubMenu addSubMenu(final int groupId, final int itemId, int order, final CharSequence title);
正確來說,SubMenu 是 MenuItem 的一種延伸,這一點可以從 XML 設定來出端倪來。

menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:orderInCategory="1" android:id="@+id/item1" android:title="壹"></item>
 <item android:orderInCategory="3" android:id="@+id/item3" android:title="參"></item>
 <item android:orderInCategory="2" android:id="@+id/item2" android:title="貳...">
  <menu>
   <item android:orderInCategory="5" android:id="@+id/item5" android:title="伍"></item>
   <item android:orderInCategory="4" android:id="@+id/item4" android:title="肆"></item>
  </menu>
 </item>
</menu>
SubMenu 使用 menu tag,包附在 item tag 裡,這產生有趣的狀況,就是點了 SubMenu 像是點了 MenuItem 一樣,除了可以執行 MenuItem 的內容外,Android 另外會去開啟 SubMenu。

SubMenuActivity
public class SubMenuActivity extends Activity {

 private Menu menu;
 private int total;

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

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // 要 keep 下來供後續使用,除了這裡,沒有其他方法可以取得 menu 物件
  this.menu = menu;
  MenuInflater inflater = this.getMenuInflater();
  inflater.inflate(R.menu.menu, menu);
  return super.onCreateOptionsMenu(menu);
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.item1:
   this.total += 10;
   break;
  case R.id.item2:
   // 這是 SubMenu 的 id,可以在這做些事情
   this.total -= 20;
   break;
  case R.id.item3:
   this.total += 30;
   break;
  case R.id.item4:
   this.total -= 40;
   break;
  case R.id.item5:
   this.total += 50;
   break;
  default:
   // 交給別人來處理,有可能是 system menu
   return super.onOptionsItemSelected(item);
  }
  TextView tv = (TextView) this.findViewById(R.id.tv);
  tv.setText(tv.getText() + "\n" + item.getTitle() + " -> " + this.total);
  // 回傳 true 表示已經處理完畢,不用再往外丟了
  return true;
 }
}

沒有留言:

張貼留言