android菜單詳解二:選項菜單

來源:互聯網
上載者:User

建立一個選項菜單

選項菜單裡應該包含基本的activity動作和必須的導航條目 (例如,一個開啟程式設定的功能表項目). 選項菜單的功能表項目有兩種不同的選擇方法,一是功能表項目按鈕,二是通過 Action Bar (在Android 3.0及以上版本中).

圖1:瀏覽器中的選項菜單


圖 2. Email程式中的動作欄,具有兩個動作和一個溢出菜單

當 運行於Android 2.3及更低版本時,選項菜單出現在螢幕的底部,見圖1.當開啟選項菜單時,首先映入眼帘的是表徵圖菜單,它有六個功能表項目,如果你加入了多於六個功能表項目,系 統會把第六個功能表項目和後面的功能表項目放到溢出菜單中,使用者可以通過 "More"功能表項目開啟它們.

Android 3.0及以後版本中,選項功能表項目被放在Action Bar上.Action Bar位於Activity的頂部傳統的Title bar所在的位置.預設情況下,所有的來自選項菜單的功能表項目都衣放入溢出菜單中.使用者可以觸擊Action bar右邊的菜單表徵圖以開啟之.但是,你也可以把功能表項目作為"action items"直接放到 Action Bar上 ,像圖2所示那樣.

當系統第一次建立選項菜單時,它調用你的activity的方法 onCreateOptionsMenu() . 重寫這個方法並且為傳入的參數 Menu 建立執行個體.Menu 是通過inflate一個菜單資源建立的,如下:

@Override<br />public boolean onCreateOptionsMenu(Menu menu) {<br /> MenuInflater inflater = getMenuInflater();<br /> inflater.inflate(R.menu.game_menu, menu);<br /> return true;<br />}你也可以在代碼中產生menu,然後使用方法 add() 添加功能表項目.

注意:在Android 2.3 及更低版本中,當使用者第一次開啟選項菜單時系統調用 onCreateOptionsMenu() 建立選項菜單,但是在Android 3.0及更高版本中, 系統在Activity一建立時就建立選項菜單,為的是建立Action Bar.

響應使用者動作

當使用者選擇一個功能表項目 (也包括Action Bar上的動作項), 系統會調用你的activity的方法 onOptionsItemSelected() .這個方法會在參數中傳入選擇的功能表項目.你可以通過調用方法getItemId()定位這個功能表項目 ,這個方法會返回功能表項目的唯一ID (在菜單資源檔中以android:id屬性定義或在調用方法add()時傳入的整數). 你可以使用已知的功能表項目來匹配這個ID並執行相關的動作,例如:

@Override<br />public boolean onOptionsItemSelected(MenuItem item) {<br /> // Handle item selection<br /> switch (item.getItemId()) {<br /> case R.id.new_game:<br /> newGame();<br /> return true;<br /> case R.id.help:<br /> showHelp();<br /> return true;<br /> default:<br /> return super.onOptionsItemSelected(item);<br /> }<br />}在 這個例子中, getItemId() 擷取所選功能表項目的ID並在switch語句中與資源檔中所有菜單ID比較。當switch語句中成功處理了功能表項目,就返回 true 以表明所選 的功能表項目被處理了。否則,default 語句會把功能表項目傳給父類,也許父類會處理這個功能表項目 (如果你直接從 Activity派生,那麼父類會返回false, 但是把未處理的功能表項目傳給父類而不是直接返回false是一個好習慣.)

另外, Android 3.0 增加了在菜單資源XML檔案中定義功能表項目的點擊行為的能力,這個能力通過 android:onClick 屬性定義 。所以你不需要實現 onOptionsItemSelected(). 使用 android:onClick 屬性,你可以指定一個方法在功能表項目被選擇時調用. 你的 activity 必須實現在屬性android:onClick中指定的方法,它接受一個MenuItem 參數---當系統調用這個方法時選中的菜單從這個參數傳入。

小 技巧:如果你的程式中包含多個 activitie並且它們提供相同的選項菜單,應考慮建立一個只實現了 onCreateOptionsMenu() 和 onOptionsItemSelected()的activity 類,然後讓那些提供相同選項菜單的activity都從這個類派生.通過這種方式,你只需為這個類的子孫們管理一組代碼。

如果你想在孫子 activitie們中添加功能表項目,只需重寫 onCreateOptionsMenu(). 在其中調用 super.onCreateOptionsMenu(menu) ,於是原始的菜單被建立,然後通過方法menu.add()添加新功能表項目。你也可以重寫父類的方法來建立另外的功能表項目們。

在運行時改變功能表項目們

一旦activity被建立,方法onCreateOptionsMenu() 只會被調用一次(前面已經說過).系統會儲存並重用這個菜單,直到你的activity被銷毀.如果你想在菜單建立後再去改變它怎麼辦呢?你必須重寫方法 onPrepareOptionsMenu() . 它會傳給你已建立的菜單的執行個體.在你想跟據應用的狀態刪除,添加,disable, or enable功能表項目們的時候就用到這個函數了.

在 Android 2.3和其之前的版本,系統在每次開啟選項菜單時都會調用 onPrepareOptionsMenu() .

在 Android 3.0 及以後版本中,你必須在你想更新菜單之前主動調用方法 invalidateOptionsMenu() , 因為菜單是一直開啟的.系統之後會調用onPrepareOptionsMenu() ,於是你就可以更改功能表項目了.

注: 你永遠不要更改當前具有焦點的View的選項菜單.當處於觸摸模式 (使用者沒有使用軌跡球或方向鍵), views不能取得焦點,所以你永遠不能基於焦點來修改選項菜單的功能表項目. 如果你想為View提供上下文敏感的功能表項目,使用 Context Menu.

如果你正在開發 Android 3.0 或更高版本之上的應用,還需閱讀 Action Bar 的開發指南.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.