目录(?)[+]

本文转载自:http://blog.csdn.net/u010583599/article/details/51605572


Android菜单类型

菜单是为了增加更多的功能,不占用屏幕的空间。Android中菜单类型有三类,选项菜单(OptionMenu)、上下文菜单(ContextMenu)、子菜单(SubMenu),下面分别详细介绍这些菜单。

选项菜单(OptionMenu

① 创建选项菜单:重写ActivityonCreateOptionMenuMenu menu)方法。

-设置菜单项可用代码动态设置menu.add();

-还可以通过xml设置MenuInflater.inflate();

②设置菜单点击事件:onOptionsItemSelected();

③菜单关闭后发生的动作:onOptionMenuClosed(Menu menu);

④选项菜单显示之前会调用,可以在这里根据需要调整菜单:onPrepareOptionsMenu(Menu menu);

⑤打开后发生的动作。 onMenuOpened(int featureId,Menu menu);

 

方法一:通过xml设置菜单(res/menu/menu.xml

[html]  view plain  copy
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     tools:context="com.example.menudemo.MenuActivity" >  
  4.    <group android:id="@+id/group1">  
  5.      <item  
  6.         android:id="@+id/action_menu1"  
  7.         android:orderInCategory="300"  
  8.         android:menuCategory="container"  
  9.         android:showAsAction="never"  
  10.         android:title="menu1"/>  
  11.     <item  
  12.         android:id="@+id/action_menu2"  
  13.         android:orderInCategory="200"  
  14.         android:menuCategory="system"  
  15.         android:showAsAction="never"  
  16.         android:title="menu2"/>  
  17.    group>  
  18.    <group android:id="@+id/group2">  
  19.        <item  
  20.         android:id="@+id/action_menu3"  
  21.         android:orderInCategory="100"  
  22.         android:menuCategory="secondary"  
  23.         android:showAsAction="never"  
  24.         android:title="menu3"/>  
  25.     <item  
  26.         android:id="@+id/action_menu4"  
  27.         android:orderInCategory="400"  
  28.         android:menuCategory="alternative"  
  29.         android:showAsAction="never"  
  30.         android:title="menu4"/>  
  31.    group>    
  32. menu>  

标签的属性含义解释:

属性名

作用

menuCategory

设置菜单项的种类。有四个可选值:Containersystemsecondaryalternative。通过menuCategory属性可以控制菜单项的位置。

orderInCategory

同类菜单的排列顺序,为整数值,值越大显示越靠前。

titleCondensed

菜单项的短标题。当菜单文字太长时显示这个

alphabeticShortcut

菜单项的字母快捷键。

showAsAction

Never:总是显示在移除菜单中。

Always:显示在ActionBar上。

ifRoom:如果actionBar空间足够就显示在ActionBar上。

withText:默认格式如果是含有文字和图表的话,只显示图标,使用ifRoom|withText可以显示图标和文字。

collapseActionView:

       android:title="@string/menu_search"
       android:icon="@drawable/ic_menu_search"

          android:showAsAction="ifRoom|collapseActionView"

           android:actionViewClass="android.widget.SearchView" />

android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。

参考链接:http://blog.csdn.NET/think_soft/article/details/7370686

标签的作用是可以进行整组操作,把一些具有相同操作的菜单放到一个组内。

Activity里加载菜单

[java]  view plain  copy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         // Inflate the menu; this adds items to the action bar if it is present.  
  4.         getMenuInflater().inflate(R.menu.menu, menu);  
  5.         return true;  
  6.     }  

方法二:通过代码添加menu

[java]  view plain  copy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         //调用这个方法设置图标的可见性  
  4.         setIconVisible(menu);  
  5.         /* 
  6.          * add()方法的四个参数,依次是: 
  7.          * 1、组别,如果不分组的话就写Menu.NONE, 
  8.          * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 
  9.          * 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前 
  10.          * 4、文本,菜单的显示文本 
  11.          */  
  12.         menu.add(Menu.NONE, Menu.FIRST + 15"删除").setIcon(  
  13.         android.R.drawable.ic_menu_delete);  
  14.         // setIcon()方法设置菜单图标  
  15.         menu.add(Menu.NONE, Menu.FIRST + 22"保存").setIcon(  
  16.         android.R.drawable.ic_menu_save);  
  17.         menu.add(Menu.NONE, Menu.FIRST + 36"帮助").setIcon(  
  18.         android.R.drawable.ic_menu_help);  
  19.         menu.add(Menu.NONE, Menu.FIRST + 41"添加").setIcon(  
  20.         android.R.drawable.ic_menu_add);  
  21.         menu.add(Menu.NONE, Menu.FIRST + 54"详细").setIcon(  
  22.         android.R.drawable.ic_menu_info_details);  
  23.         menu.add(Menu.NONE, Menu.FIRST + 63"发送").setIcon(  
  24.         android.R.drawable.ic_menu_send);  
  25.         return true;  
  26. }  
  27. //使用反射设置menu图标的可见性  
  28.     private void setIconVisible(Menu menu) {  
  29.         try {  
  30.             Class clazz = Class  
  31.                     .forName("com.android.internal.view.menu.MenuBuilder");  
  32.             Method m = clazz.getDeclaredMethod("setOptionalIconsVisible",  
  33.                     boolean.class);  
  34.             m.setAccessible(true);  
  35.             m.invoke(menu, true);  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  

菜单显示效果如下图:

选项菜单设置点击监听

[java]  view plain  copy
  1. @Override  
  2.     public boolean onOptionsItemSelected(MenuItem item) {  
  3.         Log.i(TAG, "onOptionsItemSelected");  
  4.         int id = item.getItemId();  
  5.         switch (id) {  
  6.         case Menu.FIRST+1:  
  7.             Toast.makeText(MenuActivity.this"点击了删除按钮", Toast.LENGTH_SHORT).show();  
  8.             break;  
  9.         default:  
  10.             break;  
  11.         }  
  12.         return super.onOptionsItemSelected(item);  
  13.     }  

上下文菜单

当用户长时间按键不放时,弹出来的菜单称为上下文菜单。Windows中用鼠标右键弹出的菜单就是上下文菜单。

 

创建上下文菜单的步骤:

① 调用registerForContextMenu()方法,为视图注册上下文菜单。如textView tv

registerForcontextMenu(tv);

[java]  view plain  copy
  1. @Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.activity_menu);  
  5.         tv = (TextView)findViewById(R.id.tv);  
  6.         registerForContextMenu(tv);  
  7.     }  

② 覆盖ActivityonCreateContextMenu()方法,调用Menuadd方法添加菜单项(MenuItem

[java]  view plain  copy
  1. @Override  
  2.     public void onCreateContextMenu(ContextMenu menu, View v,  
  3.             ContextMenuInfo menuInfo) {  
  4.         setIconVisible(menu);  
  5.         // TODO Auto-generated method stub  
  6.          menu.add(Menu.NONE, Menu.FIRST + 15"删除").setIcon(  
  7.                     android.R.drawable.ic_menu_delete);  
  8.         // setIcon()方法设置菜单图标  
  9.         menu.add(Menu.NONE, Menu.FIRST + 22"保存").setIcon(  
  10.                     android.R.drawable.ic_menu_save);  
  11.         menu.add(Menu.NONE, Menu.FIRST + 36"帮助").setIcon(  
  12.                     android.R.drawable.ic_menu_help);  
  13.         menu.add(Menu.NONE, Menu.FIRST + 41"添加").setIcon(  
  14.                     android.R.drawable.ic_menu_add);  
  15.         menu.add(Menu.NONE, Menu.FIRST + 54"详细").setIcon(  
  16.                     android.R.drawable.ic_menu_info_details);  
  17.         menu.add(Menu.NONE, Menu.FIRST + 63"发送").setIcon(  
  18.                     android.R.drawable.ic_menu_send);  
  19.         super.onCreateContextMenu(menu, v, menuInfo);  
  20.     }  

③ 覆盖onContextItemSelected()方法,响应菜单单击事件。

[java]  view plain  copy
  1. @Override  
  2.     public boolean onContextItemSelected(MenuItem item) {  
  3.         // TODO Auto-generated method stub  
  4.         int id = item.getItemId();  
  5.         switch (id) {  
  6.         case Menu.FIRST+1:  
  7.             Toast.makeText(MenuActivity.this"点击了删除按钮", Toast.LENGTH_SHORT).show();  
  8.             break;  
  9.         default:  
  10.             break;  
  11.         }  
  12.         return super.onContextItemSelected(item);  
  13.     }  

显示效果

子菜单

子菜单:把相同功能的分组进行多组显示的菜单。

 

创建子菜单步骤:

① 覆盖ActivityonCreateOptionsMenu()方法,调用MenuaddSubMenu()方法添加子菜单项(subMenu

[java]  view plain  copy
  1. @Override  
  2.     public boolean onCreateOptionsMenu(Menu menu) {  
  3.         //调用这个方法设置图标的可见性  
  4.         setIconVisible(menu);  
  5.         /* 
  6.          * add()方法的四个参数,依次是: 
  7.          * 1、组别,如果不分组的话就写Menu.NONE, 
  8.          * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 
  9.          * 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前 
  10.          * 4、文本,菜单的显示文本 
  11.          */  
  12.          
  13.       //添加子菜单    
  14.         SubMenu subMenu = menu.addSubMenu(0,2,Menu.NONE, "难度星级->").setIcon(android.R.drawable.ic_menu_directions);    
  15.           //添加子菜单项    
  16.           subMenu.add(21001"☆☆☆☆☆");    
  17.           subMenu.add(21012"☆☆☆");    
  18.           subMenu.add(21023"☆");  
  19. }  

② 覆盖onOptionsItemSelected()方法响应点击事件。上下文菜单处理方式和此一致。

[java]  view plain  copy
  1. @Override  
  2.     public boolean onOptionsItemSelected(MenuItem item) {  
  3.         Log.i(TAG, "onOptionsItemSelected");  
  4.         int id = item.getItemId();  
  5.         switch (id) {  
  6.         case 100:  
  7.             Toast.makeText(MenuActivity.this"点击了五颗星", Toast.LENGTH_SHORT).show();  
  8.             break;  
  9.         default:  
  10.             break;  
  11.         }  
  12.         return super.onOptionsItemSelected(item);  
  13.     }  

PopuoMenu

PopupMenu可以非常方便的在指定view的下面显示一个弹出菜单,类似于actionbar溢出菜单的效果。它的菜单选项可以来自于menu资源

使用方法

①创建PopupMenu对象,绑定view

②加载布局文件

③设置MenuItemClickListener,处理点击监听

[java]  view plain  copy
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.activity_menu);  
  4.         tv = (TextView)findViewById(R.id.tv);  
  5.         tv.setOnClickListener(new OnClickListener() {  
  6.             @Override  
  7.             public void onClick(View v) {  
  8. PopupMenu popupMenu = new PopupMenu(MenuActivity.this, tv);  
  9.                   //加载菜单文件  
  10.  popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());  
  11.                     popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {      
  12.                         @Override  
  13.                         public boolean onMenuItemClick(MenuItem item) {  
  14.                             // TODO Auto-generated method stub  
  15.                             int id = item.getItemId();  
  16.                             switch (id) {  
  17.                             case R.id.today:  
  18.                                 Toast.makeText(MenuActivity.this"点击了今天", Toast.LENGTH_SHORT).show();  
  19.                                 break;  
  20.                             default:  
  21.                                 break;  
  22.                             }  
  23.                             return false;  
  24.                         }  
  25.                     });  
  26.                     //显示popupMenu  
  27.                     popupMenu.show();  
  28.             }  
  29.         });  
  30.     }  

菜单文件popup_menu.xml

[html]  view plain  copy
  1. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  2.     <item  
  3.      android:id="@+id/today"    
  4.      android:title="今天"/>    
  5.     <item    
  6.         android:id="@+id/tomorrow"    
  7.         android:title="明天"/>    
  8. menu>  

更多相关文章

  1. PowerManager源码
  2. Android(安卓)面试
  3. Android(安卓)Media player 报错Error(38,0)
  4. android中fragment与activity之间通信原理以及例子
  5. android view(2) Activity、Window、DecorView
  6. Android(安卓)TextView实现显示时间变化
  7. Android(安卓)SeLinux权限问题和解决方法
  8. Android(安卓)SharedPreference源码浅析
  9. 查看Android(安卓)ADT Plugin版本的方法

随机推荐

  1. View机制深入学习(三) View中的消息传递及I
  2. Android中SQLite数据库中query或者rawque
  3. 2021-01-09
  4. Android(安卓)实现歌曲播放时歌词同步显
  5. android 使用ffmpeg加水印
  6. ubuntu gradle编译总结
  7. android各种对话框总结笔记
  8. android中去掉标题栏和状态栏,实现全屏
  9. Android网络技术
  10. android gdb使用