歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Menu理解與響應

       理解Android的菜單
       菜單是許多應用程序不可或缺的一部分,Android中更是如此,所有搭載Android系統的手機甚至都要有一個”Menu”鍵,由此可見菜單在Android程序中的特殊性。Android SDK提供的菜單有如下幾種:

       選項菜單:最常規的菜單,android中把它叫做option menu
       子菜單:android中點擊子菜單將彈出懸浮窗口顯示子菜單項。子菜單不支持嵌套,即子菜單中不能再其他子菜單。
       上下文菜單:android中長按視圖控件後出現的菜單,windows點擊右鍵彈出的菜單即上下文菜單
       圖標菜單:這個比較簡單,就是帶icon的菜單項,需要注意的是子菜單項、上下文菜單項、擴展菜單項均無法顯示圖標。
       選擇菜單(alternative menu):用的比較少,以後單獨介紹,本文先跳過(其實是我還沒弄明白啦o(≧v≦)o~~)
       擴展菜單:選項菜單最多只能顯示6個菜單項,超過6個時,第6個菜單項會被系統替換為一個叫“更多”的子菜單,原來顯示不下的菜單項都作為“更多”菜單的子菜單項。如下圖:


       android.view.Menu接口代表一個菜單,android用它來管理各種菜單項。注意我們一般不自己創建menu,因為每個Activity默認都自帶了一個,我們要做的是為它加菜單項和響應菜單項的點擊事件。android.view.MenuItem代表每個菜單項,android.view.SubMenu代表子菜單。其三者的關系可以用下圖來表示



       上面說過,每個activity包含一個菜單,一個菜單又能包含多個菜單項和多個子菜單,子菜單其實也是菜單(因為它實現了Menu接口),因此子菜單也可以包含多個菜單項。SubMenu繼承了Menu的addSubMenu()方法,但調用時會拋出運行時錯誤。OnCreateOptionsMenu()和OnOptionsMenuSelected()是activity中提供了兩個回調方法,用於創建菜單項和響應菜單項的點擊。


        我們看一下如何通過代碼創建和響應最常用的選項菜單(options menu)。

        創建options menu
        之前提到,Android的activity已經為我們提前創建好了android.view.Menu對象,並提供了回調方法onCreateOptionsMenu(Menu menu)供我們初始化菜單的內容。該方法只會在選項菜單第一次顯示的時候被執行,如果你需要動態改變選項菜單的內容,請使用 onPrepareOptionsMenu(Menu)。

java代碼:
  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. // 調用父類方法來加入系統菜單
  4. // 雖然目前android還沒有系統菜單,但是為了兼容到以後的版本,最好加上
  5. super.onCreateOptionsMenu(menu);

  6. // 添加菜單項(多種方式)
  7. // 1.直接指定標題
  8. menu.add("菜單項1");
  9. // 2.通過資源指定標題
  10. menu.add(R.string.menuitem2);
  11. // 3.顯示指定菜單項的組號、ID、排序號、標題
  12. menu.add(
  13. 1, //組號
  14. Menu.FIRST, //唯一的ID號
  15. Menu.FIRST, //排序號
  16. "菜單項3"); //標題

  17. // 如果希望顯示菜單,請返回true
  18. return true;
  19. }

       上面的代碼演示了添加菜單項的3種方法,下面解釋下第三種方法add(int groupId, int itemId, int order, CharSequence title)。其中,第一個參數是組號,android中你可以給菜單分組,以便快速地操作同一組的菜單。第二個參數指定每個菜單項的唯一ID號,你可以自己指定,也可以讓系統來自動分配,在響應菜單時你需要通過ID號來判斷哪個菜單被點擊了。因此常規的做法是定義一些ID常量,但在android中有更好的方法,就是通過資源文件來引用,這個之後介紹。第三個參數代表菜單項顯示順序的編號,編號小的顯示在前面。

       給菜單項分組

java代碼:
  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. super.onCreateOptionsMenu(menu);
  4. // 添加4個菜單項,分成2組
  5. int group1 = 1;
  6. int gourp2 = 2;
  7. menu.add(group1, 1, 1, "item 1");
  8. menu.add(group1, 2, 2, "item 2");
  9. menu.add(gourp2, 3, 3, "item 3");
  10. menu.add(gourp2, 4, 4, "item 4");
  11. // 顯示菜單
  12. return true;
  13. }

       你可以向上面這樣給菜單項分組,分組之後就能使用menu中提供的方法對組進行操作了,如下:

java代碼:
  1. menu.removeGroup(group1); //刪除一組菜單
  2. menu.setGroupVisible(gourp2, visible); //設置一組菜單是否可見
  3. menu.setGroupEnabled(gourp2, enabled); //設置一組菜單是否可點
  4. menu.setGroupCheckable(gourp2, checkable, exclusive); //設置一組菜單的勾選情況

        響應菜單項
        android提供了多種響應菜單項的方式,下面一一介紹
        1、通過onOptionsItemSelected方法

        使用的最多方法是重寫activity類的 onOptionsItemSelected(MenuItem)回調方法,每當有菜單項被點擊時,android就會調用該方法,並傳入被點擊菜單項。

java代碼:
  1. @Override
  2. public boolean onOptionsItemSelected(MenuItem item) {
  3. switch (item.getItemId()) {
  4. //響應每個菜單項(通過菜單項的ID)
  5. case 1:
  6. // do something here
  7. break;
  8. case 2:
  9. // do something here
  10. break;
  11. case 3:
  12. // do something here
  13. break;
  14. case 4:
  15. // do something here
  16. break;
  17. default:
  18. //對沒有處理的事件,交給父類來處理
  19. return super.onOptionsItemSelected(item);
  20. }
  21. //返回true表示處理完菜單項的事件,不需要將該事件繼續傳播下去了
  22. return true;
  23. }

       以上代碼可作為使用onOptionsItemSelected方法響應菜單的模板來使用,這裡為了方便起見將菜單ID硬編碼在程序裡,你可以使用常量或資源ID來使代碼更健壯。

       2.使用監聽器
       雖然第一種方法是推薦使用的方法,android還是提供了類似java swing的監聽器方式來響應菜單。使用監聽器的方式分為兩步:

java代碼:
  1. //第一步:創建監聽器類
  2. class MyMenuItemClickListener implements OnMenuItemClickListener {
  3. @Override
  4. public boolean onMenuItemClick(MenuItem item) {
  5. // do something here...
  6. return true; //finish handling
  7. }
  8. }

  9. //第二步:為菜單項注冊監聽器
  10. menuItem.setOnMenuItemClickListener(new MyMenuItemClickListener());

        3.使用Intent響應菜單        第3種方式是直接在MenuItem上調用setIntent(Intent intent)方法,這樣android會自動在該菜單被點擊時調用 startActivity(Intent)。但是個人認為與其這樣還不如直接在onOptionsItemSelected的case裡手動調用 startActivity(Intent)來的直觀。
Copyright © Linux教程網 All Rights Reserved