现在的位置: 首页 > 综合 > 正文

Android菜单详解

2013年08月03日 ⁄ 综合 ⁄ 共 16842字 ⁄ 字号 评论关闭

 

在各种程序中,菜单的重要性不言而喻,没有菜单各种操作就无法进行,今天来讲解一下Android的菜单,android中菜单分为三种,分别是,options menu 选项菜单,sub menu 子菜单,context menu 上下文菜单。下面分别举例演示这三种菜单:

 

新建一个android project,

options menu,第一种方法,通过xml定义选项菜单,在res文件夹中新建一个名为menu的文件夹,在其内新建一个options_menu.xml的文件:

view plaincopy to clipboardview:

  1. 1.  <?xml version="1.0" encoding="utf-8"?>    
  2. 2.  <menu xmlns:android="http://schemas.android.com/apk/res/android" >    
  3. 3.      
  4. 4.      <item    
  5. 5.          android:id="@+id/newFile"    
  6. 6.          android:icon="@drawable/ic_launcher"    
  7. 7.          android:title="@string/newFile"    
  8. 8.          />    
  9. 9.      <!-- android:icon 设置菜单选项的图标    
  10. 10.     android:title 设置菜单选项的标题 -->    
  11. 11.     <item     
  12. 12.         android:id="@+id/exit"    
  13. 13.         android:icon="@drawable/ic_launcher"    
  14. 14.         android:title="@string/exit"    
  15. 15.         />    
  16. 16.     
  17. 17. </menu>    
  18. view plain  
  19. 1.  <?xml version="1.0" encoding="utf-8"?>    
  20. 2.  <menu xmlns:android="http://schemas.android.com/apk/res/android" >    
  21. 3.      
  22. 4.      <item    
  23. 5.          android:id="@+id/newFile"    
  24. 6.          android:icon="@drawable/ic_launcher"    
  25. 7.          android:title="@string/newFile"    
  26. 8.          />    
  27. 9.      <!-- android:icon 设置菜单选项的图标    
  28. 10.     android:title 设置菜单选项的标题 -->    
  29. 11.     <item     
  30. 12.         android:id="@+id/exit"    
  31. 13.         android:icon="@drawable/ic_launcher"    
  32. 14.         android:title="@string/exit"    
  33. 15.         />    
  34. 16.     
  35. 17. </menu>    

在MenuTestActivity1中:

  1. 1.  package cn.sword.activity;    
  2. 2.      
  3. 3.  import android.app.Activity;    
  4. 4.  import android.os.Bundle;    
  5. 5.  import android.view.Menu;    
  6. 6.  import android.view.MenuInflater;    
  7. 7.  import android.view.MenuItem;    
  8. 8.  import android.view.MenuItem.OnMenuItemClickListener;    
  9. 9.  import android.widget.Toast;    
  10. 10.     
  11. 11public class MenuTestActivity1 extends Activity implements OnMenuItemClickListener{    
  12. 12.     /** Called when the activity is first created. */    
  13. 13.     @Override    
  14. 14.     public void onCreate(Bundle savedInstanceState) {    
  15. 15.         super.onCreate(savedInstanceState);    
  16. 16.         setContentView(R.layout.main);    
  17. 17.             
  18. 18.     }    
  19. 19.     
  20. 20.     @Override    
  21. 21.     public boolean onCreateOptionsMenu(Menu menu) {    
  22. 22.         MenuInflater inflater = this.getMenuInflater();    
  23. 23.         inflater.inflate(R.menu.options_menu, menu);    
  24. 24.         //第一种响应菜单点击事件的方法  
      
  25. 25.         //为每一个菜单选项添加监听事件  
      
  26. 26.         //在覆盖的onMenuItemClick()方法中判断并触发监听事件  
      
  27. 27.         for(int i=0;i<menu.size();i++){    
  28. 28.             menu.getItem(i).setOnMenuItemClickListener((OnMenuItemClickListener) this);    
  29. 29.         }    
  30. 30.     
  31. 31.         return super.onCreateOptionsMenu(menu);    
  32. 32.     }    
  33. 33.     
  34. 34.     /*第二种响应菜单点击事件的方法 覆盖onOptionsItemSelected()方法   
  35. 35.     @Override   
  36. 36.     public boolean onOptionsItemSelected(MenuItem item) {   
  37. 37.         switch(item.getItemId()){   
  38. 38.             case R.id.newFile:   
  39. 39.                 Toast.makeText(this,"new File", Toast.LENGTH_LONG).show();   
  40. 40.                 break;   
  41. 41.             case R.id.exit:   
  42. 42.                 this.finish();//退出程序   
  43. 43.                 break;   
  44. 44.         }   
  45. 45.            
  46. 46.         return super.onOptionsItemSelected(item);   
  47. 47.     }*/    
  48. 48.         
  49. 49.     public boolean onMenuItemClick(MenuItem item){    
  50. 50.         switch(item.getItemId()){    
  51. 51.         case R.id.newFile:    
  52. 52.             Toast.makeText(this"new File", Toast.LENGTH_LONG).show();    
  53. 53.             break;    
  54. 54.         case R.id.exit:    
  55. 55.             this.finish();    
  56. 56.         }    
  57. 57.             
  58. 58.         return false;    
  59. 59.     }    
  60. 60.         
  61. 61. }    

optionsmenu,第二种方法,动态添加删除菜单

在MenuTestActivity2中:

  1. <pre name="code" class="java">package cn.class3g.activity;      
  2. import android.app.Activity;    
  3. import android.os.Bundle;   
  4. import android.view.Menu;    
  5. import android.view.MenuInflater;    
  6. import android.view.MenuItem;    
  7. import android.widget.Toast;    
  8.     
  9. public class MenuTestActivity2 extends Activity {    
  10. <span style="white-space:pre">    </span>//定义菜单项  
      
  11.     private static final int SAVE=1;    
  12.     private static final int SAVESAVE_AS = SAVE+1;    
  13.     private static final int DELETE = SAVE+2;    
  14.     //声明一个menu对象     
  15.         Menu menu = null;    
  16.  public void onCreate(Bundle savedInstanceState) {    
  17.         super.onCreate(savedInstanceState);    
  18.         setContentView(R.layout.main);    
  19.     }    
  20.     
  21.     public boolean onCreateOptionsMenu(Menu menu) {    
  22.         MenuInflater inflater = this.getMenuInflater();    
  23.         inflater.inflate(R.menu.options_menu, menu);    
  24.             
  25.         //向菜单中添加菜单项     
  26.         menu.add(1, SAVE, 1"保存");    
  27.         menu.add(1,SAVE_AS, 2"另存为");    
  28.         menu.add(1,DELETE, 3"删除保存");    
  29.         //设置菜单项的图标     
  30.         menu.findItem(SAVE).setIcon(R.drawable.ic_launcher);        
  31.             
  32.         this.menu = menu;    
  33.         
  34.             return true;    
  35.         }    
  36.             
  37.     <span style="white-space:pre">    </span>//动态的修改菜单title   
      
  38.         int i=1;    
  39.         public boolean onPrepareOptionsMenu(Menu menu) {    
  40.         MenuItem item = menu.findItem(SAVE_AS);    
  41.             item.setTitle(item.getTitle() + "" + i);    
  42.              i++;    
  43.         return super.onPrepareOptionsMenu(menu);    
  44.     }    
  45.     lt;span style="white-space:pre"> </span>//响应菜单单击事件  
      
  46.     public boolean onOptionsItemSelected(MenuItem item) {    
  47.         switch (item.getItemId()) {  .      case R.id.newFile:    
  48.         Toast.makeText(this"new file", Toast.LENGTH_LONG).show();//利用Toast弹出文本信息  
      
  49.         break;    
  50.     case R.id.exit:    
  51.     // Toast.makeText(this, "exit", Toast.LENGTH_LONG).show();  
      
  52.         this.finish();//关闭Activity  
      
  53.         break;    
  54.     case DELETE:<pre name="code" class="html"><span style="white-space:pre">              

  1. <span style="white-space:pre">    </span></span>//menu.removeGroup(1);//删除一组菜单  
      
  2.         menu.removeItem(SAVE_AS);//删除一个菜单break;}return true;  

  1. <span style="white-space:pre">    </span>}  

  1. <span style="white-space:pre">    </span>}  


  1. <p align="left">sub menu子菜单</p><p align="left">利用xml定义菜单参考options menu。</p><p align="left">动态的添加子菜单:</p><p align="left">在MenuTestActivity3中:</p><pre name="code" class="java">package cn.sword.activity;    
  2.     
  3. import android.app.Activity;    
  4. import android.os.Bundle;    
  5. import android.view.Menu;    
  6. import android.view.MenuInflater;    
  7. import android.view.MenuItem;    
  8. import android.view.SubMenu;    
  9. import android.widget.Toast;    
  10.     
  11. public class MenuTestActivity3 extends Activity {    
  12. <span style="white-space:pre">    </span>//定义菜单项  
      
  13.     private static final int SUBMENU = 10;    
  14.     private static final int SUBITEM1 = SUBMENU+1;    
  15.     private static final int SUBITEM2 = SUBMENU+2;    
  16.     private static final int SUBITEM3 = SUBMENU+3;    
  17.         
  18.     @Override    
  19.     protected void onCreate(Bundle savedInstanceState) {    
  20.         super.onCreate(savedInstanceState);    
  21.         this.setContentView(R.layout.main);    
  22.     }    
  23.         
  24.     public boolean onCreateOptionsMenu(Menu menu){    
  25.         MenuInflater inflater = this.getMenuInflater();    
  26.         inflater.inflate(R.menu.sub_menu, menu);    
  27.         //添加子菜单     
  28.         SubMenu subMenu = menu.addSubMenu(1,SUBMENU,1,"子菜单");    
  29.         subMenu.add(20,SUBITEM1,1,"subitem1");    
  30.         subMenu.add(20,SUBITEM2,2,"subitem2");    
  31.         subMenu.add(30,SUBITEM3,3,"subitem3");    
  32.             
  33.     subMenu.setGroupCheckable(20truefalse);    
  34.         //第二个参数是否可选     
  35.         //当第三个参数为true时为这组菜单为互斥(单选)菜单  
      
  36.         //当第三个参数为false时为组菜单为复选菜单  
      
  37.             
  38.         MenuItem item = subMenu.getItem(0);    
  39.         //item.setCheckable(false);//设置该项菜单为单选或复选  
      
  40.         item.setChecked(true);//设置菜单的默认选项  
      
  41.     
  42.         //subMenu.getItem(0).setCheckable(true);  
      
  43.             
  44.         return true;    
  45.     }    
  46.         
  47.     @Override    
  48.     public boolean onOptionsItemSelected(MenuItem item) {    
  49.         switch(item.getItemId()){    
  50.             case R.id.menuitem1:    
  51.                 Toast.makeText(this,"menuitem1",    Toast.LENGTH_LONG).show();    
  52.                     break;    
  53.                 case R.id.menuitem2:    
  54.                     Toast.makeText(this,"menuitem2",                Toast.LENGTH_LONG).show();    
  55.                     break;    
  56.                 case R.id.subitem1:    
  57.                     Toast.makeText(this,"subitem1", Toast.LENGTH_LONG).show();    
  58.                     break;    
  59.                 case R.id.subitem2:    
  60.                 Toast.makeText(this,"subitem2", Toast.LENGTH_LONG).show();    
  61.                 break;    
  62.             case SUBITEM1:    
  63.                 Toast.makeText(this,"SUBITEM1", Toast.LENGTH_LONG).show();    
  64.                 break;    
  65.             case SUBITEM2:    
  66.                 Toast.makeText(this,"SUBITEM2", Toast.LENGTH_LONG).show();    
  67.                 //this.finish();//退出程序  
      
  68.                 break;    
  69.         }    
  70.             
  71.         return super.onOptionsItemSelected(item);    
  72.     }    
  73. }    

在模拟器中点击Menu键:

单击子菜单:


context menu 上下文菜单:context menu需要绑定在TextView上并在其上按2s后显示。

在MenuTestActivity4中:

  1. package cn.sword.activity;    
  2.         
  3.     import android.app.Activity;    
  4.     import android.os.Bundle;    
  5.     import android.view.ContextMenu;    
  6.     import android.view.ContextMenu.ContextMenuInfo;    
  7.     import android.view.MenuInflater;    
  8.     import android.view.MenuItem;    
  9.     import android.view.View;    
  10.     import android.widget.TextView;    
  11.     import android.widget.Toast;    
  12.         
  13.     public class MenuTestActivity4 extends Activity {    
  14.         @Override    
  15.         protected void onCreate(Bundle savedInstanceState) {    
  16.             super.onCreate(savedInstanceState);    
  17.             this.setContentView(R.layout.main);    
  18.             //将上下文菜单绑定到TextView上  
      
  19.             TextView tv = (TextView) this.findViewById(R.id.textView);    
  20.             this.registerForContextMenu(tv);    
  21.         }    
  22.         
  23.         @Override    
  24.         public boolean onContextItemSelected(MenuItem item) {    
  25.             switch(item.getItemId()){    
  26.                 case R.id.subitem1:    
  27.                     Toast.makeText(this"subitem1",Toast.LENGTH_LONG).show();    
  28.                     break;    
  29.                 case R.id.subitem2:    
  30.                     Toast.makeText(this"subitem2",Toast.LENGTH_LONG).show();    
  31.                     break;    
  32.             }    
  33.             return super.onContextItemSelected(item);    
  34.         }    
  35.         
  36.         //每次上下文菜单显示都会调用     
  37.         public void onCreateContextMenu(ContextMenu menu, View v,    
  38.                 ContextMenuInfo menuInfo) {    
  39.                 
  40.             MenuInflater inflater = this.getMenuInflater();    
  41.             inflater.inflate(R.menu.sub_menu, menu);    
  42.             super.onCreateContextMenu(menu, v, menuInfo);    
  43.         }    
  44.     }    

抱歉!评论已关闭.