Android開發筆記-長按選單

內容說明:建立長按(右鍵)選單

資料來源:Google!Android 2手機應用程式設計入門第三版

在電腦裡點選滑鼠右鍵會出現選單,但是在手機裡沒有滑鼠右鍵,所以會以長按畫面來代替右鍵選單,我們把它叫長按選單。長按選單的建立方式和一般MENU差不多,只有些微的不同。首先到Eclipse選單中選擇 Source > Override/Implement Methods,找到 onCreateContextMenu 和 onContextItemSelected 產生實作方法。接著參考建立MENU的方式建立長按選單。要注意的是這裡多了一個「setHeaderTitle」設定選單表頭的方法。

protected static final int MENU_BUTTON_1 = Menu.FIRST;
    protected static final int MENU_BUTTON_2 = Menu.FIRST + 1;
 
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        menu.setHeaderTitle("要如何處理這個項目?");  //設定長按選單的表頭
        menu.add(0, MENU_BUTTON_1, 0, "按鈕1");
        menu.add(0, MENU_BUTTON_2, 0, "按鈕2");
        super.onCreateContextMenu(menu, v, menuInfo);
    }
 
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        switch(item.getItemId()) {
        case MENU_BUTTON_1:
            //執行按鈕1要做的動作
            break;
        case MENU_BUTTON_2:
            //執行按鈕2要做的動作
            break;
        default:
            break;
        }
 
        return super.onContextItemSelected(item);
    }

如果上面宣告的 MENU_BUTTON_1 (按鈕ID)和一般MENU一樣,不需要重新設定。

除了實作上面二個方法外,還要在onCreate時”註冊”這個選單。因為長按選單是在畫面點選,所以我們要在onCreate()時加入registerForContextMenu()方法,讓程式知道使用者是點選那個物件時要出現選單。

//registerForContextMenu(getListView()); //註冊ContextMenu
        //在ListActivity中,因為整個畫面就是一個List,所以直接用getListView()就可以取得整個畫面

        //在一般的Activity下,必需要指定會出現長按選單的物件,所以程式可以改成:
        //registerForContextMenu(findViewById(R.id.txt_hello));
        //如果希望在畫面任何一個地方都會出現長按選單,就要先到res/layout/main.xml中,替根節點加入ID:
        //<linearlayout android:id="@+id/main_layout" ...></linearlayout>
        //這樣就可以用R.id.main_layout取得整個畫面:
        registerForContextMenu(findViewById(R.id.main_layout)); //註冊ContextMenu

另外,如果是在ListActivity裡建立長按選單,可以在 onContextItemSelected() 裡加入 AdapterContextMenuInfo 來取得使用者點選的項目。程式修改參考如下:

@Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();  //取得user選取資訊
        switch(item.getItemId()) {
        case MENU_BUTTON_1:
            return editNote(info.id);
        case MENU_BUTTON_2:
            return deleteNote(info.id);
        default:
            return super.onContextItemSelected(item);
        }
    }