詳細(xì)說明Android菜單類型
Android菜單類型作為Google遠(yuǎn)景的重要組成部分,將進(jìn)一步推進(jìn)“隨時隨地為每個人提供信息”這一企業(yè)目標(biāo)的實(shí)現(xiàn),這不但實(shí)現(xiàn)了用戶的各方面的需求,還給了蘋果那里一些的壓力。
options menu就是通過按home鍵來顯示,context menu需要在view上按上2s后顯示。這兩種menu都有可以加入子菜單,子菜單不能種不能嵌套子菜單。options menu最多只能在屏幕最下面顯示6個菜單選項(xiàng),稱為icon menu,icon menu不能有checkable選項(xiàng)。多于6的菜單項(xiàng)會以more icon menu來調(diào)出。
稱為expanded menu。options menu通過activity的onCreateOptionsMenu來生成,這個函數(shù)只會在menu第一次生成時調(diào)用。任何想改變options menu的想法只能在onPrepareOptionsMenu來實(shí)現(xiàn),這個函數(shù)會在menu顯示前調(diào)用。onOptionsItemSelected 用來處理選中的菜單項(xiàng)。
context menu是跟某個具體的view綁定在一起,在activity種用registerForContextMenu來為某個view注冊context menu。context menu在顯示前都會調(diào)用onCreateContextMenu來生成menu。onContextItemSelected用來處理選中的菜單項(xiàng)。
Android菜單類型還提供了對菜單項(xiàng)進(jìn)行分組的功能,可以把相似功能的菜單項(xiàng)分成同一個組,這樣就可以通過調(diào)用setGroupCheckable,setGroupEnabled,setGroupVisible來設(shè)置菜單屬性,而無須單獨(dú)設(shè)置。
這是一個標(biāo)準(zhǔn)的插入一個菜單項(xiàng)的方法,菜單項(xiàng)的id為MENU_ITEM_INSERT。有意思的是下面這幾句代碼:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" android:id="@+id/TextView01"/>
- <Button android:id="@+id/Button01" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="@string/txtInfo"></Button>
- </LinearLayout>
這到底有何用處呢?其實(shí)這是一種動態(tài)菜單技術(shù)(也有點(diǎn)像插件機(jī)制),若某一個activity,其類型是”android.intent.category.ALTERNATIVE”,數(shù)據(jù)是”vnd.android.cursor.dir/vnd.google.note”的話。
系統(tǒng)就會為這個activity增加一個菜單項(xiàng)。在Android菜單類型中查看后發(fā)現(xiàn),沒有一個activity符合條件,所以這段代碼并沒有動態(tài)添加出任何一個菜單項(xiàng)。怎么回事呢?查看代碼后發(fā)現(xiàn),原來是onPrepareOptionsMenu搞的鬼!這個函數(shù)在onCreateOptionsMenu之后運(yùn)行,下面這段代碼中。
由于Menu.CATEGORY_ALTERNATIVE是指向同一個組,所以把onCreateOptionsMenu中設(shè)置的菜單項(xiàng)給覆蓋掉了,而由于onPrepareOptionsMenu沒有給Menu.CATEGORY_ALTERNATIVE附新值,故Menu.CATEGORY_ALTERNATIVE還是為空。
【編輯推薦】