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

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

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

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

綜合交流 / 評測 / 活動區(qū)

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

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

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

查看: 13845|回復(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)菜單通過按下menu鍵來顯示。當(dāng)菜單打開時(shí),只顯示前六個(gè)選項(xiàng),如果超過六個(gè),多的部分會顯示在more里。超過的選項(xiàng)被添加到more菜單里是系統(tǒng)自動添加的。   
    選項(xiàng)菜單可以包含一些基本的程序功能,或者必要的導(dǎo)航。比如從主界面轉(zhuǎn)到設(shè)置界面。你可以添加Submenus 來配置你的顯示項(xiàng),讓它包含更多的功能。   
    當(dāng)menu第一次被創(chuàng)建時(shí),android系統(tǒng)會調(diào)用activity的onCreateOptionsMenu()回調(diào)方法。要添加自己的menu只需要重寫它即可。你可以在彈出的menu中包含著在xml中定義的資源?;蛘咄ㄟ^調(diào)用add()方法添加每一個(gè)選項(xiàng)。這個(gè)方法會添加一個(gè)MenuItem,并且返回你最新創(chuàng)建的對象。你可以使用它們來獲得菜單項(xiàng),然后添加一些額外的屬性,比如設(shè)置icon、快捷鍵等。   
    有很多種的add()方法,通常用的是能接收一個(gè)itemid參數(shù)的那個(gè),這個(gè)id可以讓你識別回調(diào)方法。   
    當(dāng)一個(gè)菜單項(xiàng)從菜單中被選中,你會接收一個(gè)回調(diào)方法onOptionItemSelected()。這個(gè)回調(diào)方法會傳遞你所點(diǎn)擊的菜單項(xiàng),可以通過傳來的id來判斷是哪個(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è)例子里,我們沒有設(shè)置。itemid 是我們給MenuItem的唯一的整型值,可以用在在回調(diào)方法中識別選中項(xiàng)。order允許我們自定義item顯示的順序,默認(rèn)情況下按照添加的順序顯示。title,就是顯示的標(biāo)簽名,你可以用String resource字符串資源的方式來添加,這有有助于本地化的修改。如果你想把幾個(gè)菜單項(xiàng)合成一組,你可以用Submenu來實(shí)現(xiàn)。
Icons可以通過setIcon()方法來添加。例如   
menu.add(0, MENU_QUIT,   
0,   
"Quit").setIcon(R.drawable.menu_quit_icon);
如果你想在菜單被添加之后修改它,可以重寫onPrepareOptionsMenu()方法,他在菜單每次被打開時(shí)調(diào)用。他會傳遞你的menu對象,就像onCreateOptionsMenu()方法那樣。如果你想根據(jù)程序或者游戲現(xiàn)在的狀態(tài)來確定是否修改menu 的話,這個(gè)方法將會非常有用。注意:當(dāng)改變menu里的菜單項(xiàng)時(shí),不提倡直接操作當(dāng)前選中項(xiàng)。請記住,當(dāng)在觸摸模式下,是沒有當(dāng)前選中項(xiàng)的,相反,你應(yīng)該使用Context Menu 來做這樣的操作:在UI的特定項(xiàng)目里提供這樣的功能。
android的 Context Menu 也是類似的,在PC上,即為右鍵菜單。當(dāng)一個(gè)view注冊了Context Menu 菜單后,長按這個(gè)view便能顯示菜單,提供一些與此view相關(guān)的功能。Context menus可以使用任何的view,但通常被注冊成listView,這種view會使選中的項(xiàng)目非常的明顯。(待會會有一個(gè)例子)注意:Context Menu條目不支持圖標(biāo)和快捷鍵。要?jiǎng)?chuàng)建一個(gè)Context Menu,你必須重寫activity的 Context Menu 回調(diào)方法:onCreateContextMenu()和 onContextItemSelected()方法。在onCreateContextMenu()回調(diào)方法中,你可以通過add()方法添加菜單項(xiàng),或者使用xml配置文件添加,然后yon registerForContextMenu()方法注冊成為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對象添加。ContextMenuInfo對象提供了選中對象的一些相關(guān)信息。例如,在OnCreateContextMenu()方法中添加兩個(gè)很普通的item條目。在onContextItemSelected()方法中,我們需要得到菜單項(xiàng)的AdapterContextmenuInfo,來獲取關(guān)于當(dāng)前選中項(xiàng)的某些信息。我們只需要選中條目的id即可,所以無論添加或者刪除,我們只需要知道AdapterContextMenuInfo.info 這個(gè)屬性即可。然后這個(gè)id會被傳遞到deitNote()方法或者deleteNote方法來做相應(yīng)的處理?,F(xiàn)在,為ListView中所有的項(xiàng)添加contextMenu方法,我們把整個(gè)ListView傳遞給registerForContextMenu(View)方法。registerForContextMenu(getListView());記住,你可以傳遞任何view對象來注冊 contextMenu菜單,getListView()方法會返回在ListActivity類中使用到的ListView,因此,list中的每一項(xiàng)都會注冊一個(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)方法會傳遞給父菜單的回調(diào)方法。如上所示:子菜單的選擇結(jié)果會傳遞到父菜單的onOptionsItemSelected();
就像UI布局一樣,你可以在xml文件中定義菜單。然后再onCreate()方法中實(shí)例化他們。這樣會讓你的程序代碼更加簡潔,并且讓代碼和視圖分離,更加可視化。首先,在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()方法會返回activity的菜單解析器,我們可以調(diào)用inflate()方法來傳遞先前定義好的menu資源的指針,在回調(diào)方法中可以得到菜單對象。雖然這種方式看似更加麻煩,但當(dāng)你處理大量items時(shí)會為你省很多事,并且讓你的代碼看起來更加整潔。你可以定義menu group,在group元素里包裝item來定義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號 )

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

GMT+8, 2024-9-20 04:15 , Processed in 0.072847 second(s), 15 queries , Redis On.

Powered by Discuz!

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

© 2007-2024 ZNDS.Com

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