Friday, April 22, 2011

[Android]Android動態menu選單之實作演練(onPrepareOptionsMenu)

在使用軟體時,點擊menu鍵時會出現選單,此時用:
public boolean onCreateOptionsMenu(android.view.Menu menu);
public boolean onOptionsItemSelected(android.view.MenuItem item);
以上兩種方法可以很容易的將選單加入,並控制點擊時發生的事件。

但是如果點擊之後要更新選單的狀態該如何處理呢?此時需要用到此方法:
public boolean onPrepareOptionsMenu(android.view.Menu menu);


簡單來說,onCreateOptionsMenu()此方法是控制進入該頁面之後首次點擊Menu時會出現的選單項目,此方法只會被呼叫一次。而onPrepareOptionsMenu()此方法是每次點擊Menu時都會被呼叫一次,所以在此方法中,判斷事件的發生後將需要變化的選單加入便可以達到動態menu選單的效果。

說了那麼多廢話,到底何時需要用到動態選單?舉個簡單的例子大家應該很容易明白。假設我在使用一個電子書閱讀軟體閱讀到某一頁覺得此頁的文具很棒想要加入書籤,此時按下menu鍵,選單當中有一個是『加入書籤』,我將此頁加入書籤之後又突然想將書籤移除,此時我再按下menu,選單中不應當再出現『加入書籤』,而是原本的加入書籤選單要變成『移除書籤』。那該如何建立動態選單呢?

首先在一開始宣告所有要加入menu的選單,以及一個boolean值。

private boolean changeMenu = false;
protected static final int MENU_ADD = Menu.FIRST;//加入書籤
protected static final int MENU_REMOVE = Menu.FIRST + 1;//移除書籤
protected static final int MENU_ABOUT = Menu.FIRST + 2;//關於此軟體
protected static final int MENU_QUIT = Menu.FIRST + 3;//關閉此軟體

前面有提過,onCreateOptionsMenu()此方法是控制進入該頁面之後首次點擊Menu時會出現的選單項目,此方法只會被呼叫一次。所以第二次點擊會產生變化的選單不能加入此方法中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_ADD, 0, "加入書籤").setIcon(R.drawable.add);
menu.add(0, MENU_ABOUT, 0, "關於此軟體").setIcon(R.drawable.about);
menu.add(0, MENU_QUIT, 2, "關閉此軟體").setIcon(R.drawable.logout);
return super.onCreateOptionsMenu(menu);
}

再來撰寫onOptionsItemSelected()方法,把每一個選單點擊的事件寫入,並且判斷changeMenu的boolean value。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ADD:
changeMenu = true;
//中間點擊事件省略....
break;
case MENU_REMOVE:
changeMenu = false;
//中間點擊事件省略....
break;
case MENU_ABOUT:
//中間點擊事件省略....
break;
case MENU_QUIT:
//中間點擊事件省略....
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}

最後覆寫onPrepareOptionsMenu()方法,在此方法中判斷changeMenu的boolean value達到動態選單的效果。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();//一定要把全部的menu都清除後再加入
if (changeMenu) {
menu.removeItem(MENU_ADD);
menu.add(0, MENU_REMOVE, 0, "移除書籤").setIcon(R.drawable.remove);
menu.add(0, MENU_ABOUT, 1, "關於此軟體").setIcon(R.drawable.about);
menu.add(0, MENU_QUIT, 2, "關閉此軟體").setIcon(R.drawable.logout);
} else {
menu.removeItem(MENU_REMOVE);
menu.add(0, MENU_FILTER, 0, "加入書籤").setIcon(R.drawable.add);
menu.add(0, MENU_ABOUT, 1, "關於此軟體").setIcon(R.drawable.about);
menu.add(0, MENU_QUIT, 2, "關閉此軟體").setIcon(R.drawable.logout);
}
return super.onPrepareOptionsMenu(menu);
}

0 comments:

Post a Comment