2011年6月10日 星期五

Android程式設計 - Context menu

Context menu是跟某個具體的view綁定在一起,當使用者在該view上按幾秒後就會自動顯示。程式中必須使用registerForContextMenu()方法來為view註冊Context menu。
例如希望在一個id為main的佈局版面上提供Context menu,可在Activity之onCreate()方法中使用registerForContextMenu()方法來為該佈局物件註冊Context menu。

public void onCreate(Bundle savedInstanceState) {
...
LinearLayout lv = LinearLayout)findViewById(R.id.main);
registerForContextMenu(lv);
}

接著我們需要為Context menu建構功能表項目內容及實作功能表項目作業程式碼,參照下列程序,為Activity建立onCreateContextMenu()onContextItemSelected ()程式框架:
1. 由Source功能表點選「Override/Implement Methods...」功能表項目。
2. 由對話視窗之「Select methods to override or implements:」清單中勾選「onContextItemSelected()」及「onCreateContextMenu()」項目,按下「OK」按鈕,ADT就會建立所需的程式框架。


Options menu的onCreateOptionsMenu()只需調用乙次,而Context menu則是每次顯示時都會調用onCreateContextMenu()。程式中同樣可使用add()方法將功能表項目加到Context menu中;或使用addSubMenu()方法加入子功能表。
Context menu功能表項目不支援圖示,但允許結合核取方塊或圖形選取鈕介面來呈現功能表項目的狀態,所以同樣可以使用以下方法:
setCheckable(true) 在功能表項目上顯示核取方塊。
setCheckable(false) 功能表項目不顯示核取方塊。
setChecked(true) 設定功能表項目之核取方塊為勾選狀態。
setChecked(false) 設定功能表項目之核取方塊為取消勾選狀態。

final int MENU_QUIT = 100;
final int MENU_ABOUT = 101;
final int MENU_AUTHOR = 102;
...
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    // TODO Auto-generated method stub
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(0, MENU_QUIT, 0, "結束");
    Menu abtmenu = menu.addSubMenu(0, MENU_ABOUT, 0, "關於...");
    abtmenu.add(0, MENU_AUTHOR, 0, "作者");
    abtmenu.add(0, MENU_PROG, 0, "Android程式");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId()){
        case MENU_AUTHOR:
            Toast.makeText (MainActivity.this, R.string.author, Toast.LENGTH_SHORT).show();
            break;
        case MENU_PROG:
            Toast.makeText (MainActivity.this, R.string.prog, Toast.LENGTH_SHORT).show();
            break;
        case MENU_QUIT:
            finish();
    }
    return super.onContextItemSelected(item);
}