2011-11-03

在 Android 使用 Group Menu

將 MenuItem 分 group 的主要目的就是同時對多個 MenuItem 進行某些操作:
  • setGroupEnabled(...)
  • setGroupVisible(...)
  • setGroupCheckable(...)
  • removeGroup(...)
這些 API 都屬於 Menu。

GroupMenuActivity
public class GroupMenuActivity extends Activity {

 private Menu menu;
 private boolean enabled = true;
 private boolean visible = true;
 private boolean checkable = false;
 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);
  this.syncText();
  return super.onCreateOptionsMenu(menu);
 }

 private void syncText() {
  // 不能用 findViewById,得用 menu.findItem(...)
  this.menu.findItem(R.id.enable).setTitle(
    this.enabled ? "Disable" : "Enable");
  this.menu.findItem(R.id.visible).setTitle(
    this.visible ? "Hide" : "Show");
  this.menu.findItem(R.id.checkable).setTitle(
    this.checkable ? "Normal" : "Checkable");
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  case R.id.item1:
   this.total += 10;
   break;
  case R.id.item2:
   this.total -= 20;
   break;
  case R.id.enable:
   this.enabled = !this.enabled;
   this.menu.setGroupEnabled(R.id.group, this.enabled);
   break;
  case R.id.visible:
   this.visible = !this.visible;
   this.menu.setGroupVisible(R.id.group, this.visible);
   break;
  case R.id.checkable:
   this.checkable = !this.checkable;
   // 第三個 boolean 參數 true 表示 radio,false 表示 checkbox,但試不出來
   this.menu.setGroupCheckable(R.id.group, this.checkable, true);
   break;
  case R.id.remove:
   // 移除 menu group 裡的所有 menu item,不是移除 menu group
   this.menu.removeGroup(R.id.group);
   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);
  this.syncText();
  // 回傳 true 表示已經處理完畢,不用再往外丟了
  return true;
 }
}
menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/group" android:orderInCategory="1">
        <item android:id="@+id/item1" android:title="壹" android:orderInCategory="1"></item>
        <item android:id="@+id/item2" android:title="貳" android:orderInCategory="2"></item>
    </group>
    <item android:id="@+id/enable" android:title="Enable" android:orderInCategory="2"></item>
    <item android:id="@+id/visible" android:title="Visible" android:orderInCategory="3"></item>
    <item android:id="@+id/checkable" android:title="Checkable" android:orderInCategory="4"></item>
    <item android:id="@+id/remove" android:title="Remove" android:orderInCategory="5"></item>
</menu>
有三個特別的地方要注意,第一個就是除了在 onCreateOptionsMenu(...) 可以摸到 Menu 物件以外,其他地方都看不到,鑑於每個 activity 只會有一個 Menu 物件,所以可以在此將 Menu 物件 keep 下來給其他 method 使用。

第二個就是 removeGroup(...) 是移除 Group 裡的所有 MenuItem,不是移除 Group 本身。

最後就是無法用 findViewById(...) 取得 MenuItem 物件,得透過 Menu 物件的 findItem(...) 才行。

沒有留言:

張貼留言