首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門(mén) / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 14884|回復(fù): 0
上一主題 下一主題
[教程]

《Android Dev Guide》系列教程10:用戶界面之創(chuàng)建菜單

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
>     
    選項(xiàng)菜單通過(guò)按下menu鍵來(lái)顯示。當(dāng)菜單打開(kāi)時(shí),只顯示前六個(gè)選項(xiàng),如果超過(guò)六個(gè),多的部分會(huì)顯示在more里。超過(guò)的選項(xiàng)被添加到more菜單里是系統(tǒng)自動(dòng)添加的。   
    選項(xiàng)菜單可以包含一些基本的程序功能,或者必要的導(dǎo)航。比如從主界面轉(zhuǎn)到設(shè)置界面。你可以添加Submenus 來(lái)配置你的顯示項(xiàng),讓它包含更多的功能。   
    當(dāng)menu第一次被創(chuàng)建時(shí),android系統(tǒng)會(huì)調(diào)用activity的onCreateOptionsMenu()回調(diào)方法。要添加自己的menu只需要重寫(xiě)它即可。你可以在彈出的menu中包含著在xml中定義的資源?;蛘咄ㄟ^(guò)調(diào)用add()方法添加每一個(gè)選項(xiàng)。這個(gè)方法會(huì)添加一個(gè)MenuItem,并且返回你最新創(chuàng)建的對(duì)象。你可以使用它們來(lái)獲得菜單項(xiàng),然后添加一些額外的屬性,比如設(shè)置icon、快捷鍵等。   
    有很多種的add()方法,通常用的是能接收一個(gè)itemid參數(shù)的那個(gè),這個(gè)id可以讓你識(shí)別回調(diào)方法。   
    當(dāng)一個(gè)菜單項(xiàng)從菜單中被選中,你會(huì)接收一個(gè)回調(diào)方法onOptionItemSelected()。這個(gè)回調(diào)方法會(huì)傳遞你所點(diǎn)擊的菜單項(xiàng),可以通過(guò)傳來(lái)的id來(lái)判斷是哪個(gè)菜單項(xiàng)。一旦你定義了菜單項(xiàng),就可以添加適當(dāng)?shù)奶幚頃r(shí)間處理方法。   
    這里有一斷activity中的代碼,你可以這樣定義并且處理他們的選擇事件:   
   
   
  1. view plaincopy to clipboardprint?   
    /* Creates the menu items */     
    public boolean onCreateOptionsMenu(Menu menu) {     
        menu.add(0, MENU_NEW_GAME, 0, "New Game");     
        menu.add(0, MENU_QUIT, 0, "Quit");     
        return true;     
    }     
    /* Handles item selections */     
    public boolean onOptionsItemSelected(MenuItem item) {     
        switch (item.getItemId()) {     
        case MENU_NEW_GAME:     
            newGame();     
            return true;     
        case MENU_QUIT:     
            quit();     
            return true;     
        }     
        return false;     
    }  
復(fù)制代碼
在這個(gè)例子中使用的add()方法有四個(gè)參數(shù):groupId、itemId、 order 和 title。groupId允許你將要添加的條目添加到groupId躲在項(xiàng)里。這個(gè)例子里,我們沒(méi)有設(shè)置。itemid 是我們給MenuItem的唯一的整型值,可以用在在回調(diào)方法中識(shí)別選中項(xiàng)。order允許我們自定義item顯示的順序,默認(rèn)情況下按照添加的順序顯示。title,就是顯示的標(biāo)簽名,你可以用String resource字符串資源的方式來(lái)添加,這有有助于本地化的修改。如果你想把幾個(gè)菜單項(xiàng)合成一組,你可以用Submenu來(lái)實(shí)現(xiàn)。
Icons可以通過(guò)setIcon()方法來(lái)添加。例如   
menu.add(0, MENU_QUIT,   
0,   
"Quit").setIcon(R.drawable.menu_quit_icon);
如果你想在菜單被添加之后修改它,可以重寫(xiě)onPrepareOptionsMenu()方法,他在菜單每次被打開(kāi)時(shí)調(diào)用。他會(huì)傳遞你的menu對(duì)象,就像onCreateOptionsMenu()方法那樣。如果你想根據(jù)程序或者游戲現(xiàn)在的狀態(tài)來(lái)確定是否修改menu 的話,這個(gè)方法將會(huì)非常有用。注意:當(dāng)改變menu里的菜單項(xiàng)時(shí),不提倡直接操作當(dāng)前選中項(xiàng)。請(qǐng)記住,當(dāng)在觸摸模式下,是沒(méi)有當(dāng)前選中項(xiàng)的,相反,你應(yīng)該使用Context Menu 來(lái)做這樣的操作:在UI的特定項(xiàng)目里提供這樣的功能。
android的 Context Menu 也是類似的,在PC上,即為右鍵菜單。當(dāng)一個(gè)view注冊(cè)了Context Menu 菜單后,長(zhǎng)按這個(gè)view便能顯示菜單,提供一些與此view相關(guān)的功能。Context menus可以使用任何的view,但通常被注冊(cè)成listView,這種view會(huì)使選中的項(xiàng)目非常的明顯。(待會(huì)會(huì)有一個(gè)例子)注意:Context Menu條目不支持圖標(biāo)和快捷鍵。要?jiǎng)?chuàng)建一個(gè)Context Menu,你必須重寫(xiě)activity的 Context Menu 回調(diào)方法:onCreateContextMenu()和 onContextItemSelected()方法。在onCreateContextMenu()回調(diào)方法中,你可以通過(guò)add()方法添加菜單項(xiàng),或者使用xml配置文件添加,然后yon registerForContextMenu()方法注冊(cè)成為ContextMenu。例如,下面是在筆記本應(yīng)用程序中添加contextMenu的例子:   
  1. view plaincopy to clipboardprint?   
    public void onCreateContextMenu(ContextMenu menu, View v,     
                                    ContextMenuInfo menuInfo) {     
      super.onCreateContextMenu(menu, v, menuInfo);     
      menu.add(0, EDIT_ID, 0, "Edit");     
      menu.add(0, DELETE_ID, 0,  "Delete");     
    }     
    public boolean onContextItemSelected(MenuItem item) {     
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();     
      switch (item.getItemId()) {     
      case EDIT_ID:     
        editNote(info.id);     
        return true;     
      case DELETE_ID:     
        deleteNote(info.id);     
        return true;     
      default:     
        return super.onContextItemSelected(item);     
      }     
    }  
復(fù)制代碼
在onCreateContextmenu()方法中,我們不僅僅只能給contextMenu添加菜單項(xiàng),而且還可以給選中的view或者是ContextMenuInfo對(duì)象添加。ContextMenuInfo對(duì)象提供了選中對(duì)象的一些相關(guān)信息。例如,在OnCreateContextMenu()方法中添加兩個(gè)很普通的item條目。在onContextItemSelected()方法中,我們需要得到菜單項(xiàng)的AdapterContextmenuInfo,來(lái)獲取關(guān)于當(dāng)前選中項(xiàng)的某些信息。我們只需要選中條目的id即可,所以無(wú)論添加或者刪除,我們只需要知道AdapterContextMenuInfo.info 這個(gè)屬性即可。然后這個(gè)id會(huì)被傳遞到deitNote()方法或者deleteNote方法來(lái)做相應(yīng)的處理。現(xiàn)在,為L(zhǎng)istView中所有的項(xiàng)添加contextMenu方法,我們把整個(gè)ListView傳遞給registerForContextMenu(View)方法。registerForContextMenu(getListView());記住,你可以傳遞任何view對(duì)象來(lái)注冊(cè) contextMenu菜單,getListView()方法會(huì)返回在ListActivity類中使用到的ListView,因此,list中的每一項(xiàng)都會(huì)注冊(cè)一個(gè)contextMenu。
一個(gè)子菜單可以被添加到任何菜單,但不不能添加到子菜單中。當(dāng)你的應(yīng)用程序有很多功能需要被顯示的時(shí)候非常有用。你可以用add()方法給menu添加額外的條目,例如:   
  1. view plaincopy to clipboardprint?   
    SubMenu fileMenu = menu.addSubMenu("File");     
      SubMenu editMenu = menu.addSubMenu("Edit");     
      fileMenu.add("new");     
      fileMenu.add("open");     
      fileMenu.add("save");     
      editMenu.add("undo");     
      editMenu.add("redo");     
      return result;     
    }  
復(fù)制代碼
子菜單中的回調(diào)方法會(huì)傳遞給父菜單的回調(diào)方法。如上所示:子菜單的選擇結(jié)果會(huì)傳遞到父菜單的onOptionsItemSelected();
就像UI布局一樣,你可以在xml文件中定義菜單。然后再onCreate()方法中實(shí)例化他們。這樣會(huì)讓你的程序代碼更加簡(jiǎn)潔,并且讓代碼和視圖分離,更加可視化。首先,在res文件夾下建立一個(gè)menu文件夾。你可以在這里定義菜單。在一個(gè)菜單的xml布局中,有三個(gè)元素:<menu><group><item>。Item和group元素必須是menu的子元素,但item還可以是group的子元素,menu元素必須有一個(gè)子元素,當(dāng)然了,最外層的根元素必須是menu。作為一個(gè)例子,我們建一個(gè)和上面一樣的操作菜單,先在res/menu/文件夾下建一個(gè)option_menu.xml文件   
  1. view plaincopy to clipboardprint?   
    <menu xmlns:android="http://schemas.android.com/apk/res/android">     
        <item android:id="@+id/new_game"     
              android:title="New Game" />     
        <item android:id="@+id/quit"     
              android:title="Quit" />     
    </menu>  
復(fù)制代碼
然后,在onCreateOptionsMenu()方法中,我們用MenuInflater.inflate()方法加載這個(gè)資源:
   
  1. view plaincopy to clipboardprint?   
    public boolean onCreateOptionsMenu(Menu menu) {     
        MenuInflater inflater = getMenuInflater();     
        inflater.inflate(R.menu.options_menu, menu);     
        return true;     
    }  
復(fù)制代碼
getMenuInflater()方法會(huì)返回activity的菜單解析器,我們可以調(diào)用inflate()方法來(lái)傳遞先前定義好的menu資源的指針,在回調(diào)方法中可以得到菜單對(duì)象。雖然這種方式看似更加麻煩,但當(dāng)你處理大量items時(shí)會(huì)為你省很多事,并且讓你的代碼看起來(lái)更加整潔。你可以定義menu group,在group元素里包裝item來(lái)定義menu group,并且在item里創(chuàng)建別的menu,每個(gè)元素都支持一些基本屬性如快捷鍵、選擇框、圖標(biāo)等。學(xué)習(xí)更多的屬性可以參考XML syntax.   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

上一篇:《Android Dev Guide》系列教程11:用戶界面之Menu菜單特性
下一篇:《Android Dev Guide》系列教程9:用戶界面之聲明布局

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書(shū) | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2025-1-24 11:32 , Processed in 0.065389 second(s), 16 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2025 ZNDS.Com

快速回復(fù) 返回頂部 返回列表