先看下效果:
菜单在程序中使用颇为广泛,几乎所有的桌面应用都含有菜单。Android的菜单分为三种类型
option menu:选项菜单
context menu: 上下文菜单
popup menu:弹出菜单
本文讲解的是选项菜单。
1.首先在res目录下,创建menu文件夹,之后在menu文件中,创建item_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/item_home" android:title="首页" android:icon="@drawable/ic_about" app:showAsAction="never" android:orderInCategory="1" > </item> <item android:id="@+id/item_quit" android:title="退出" android:icon="@drawable/ic_quit" app:showAsAction="never" android:orderInCategory="2" > </item> </menu>
2.之后在创建的Activity中重写onCreateOptionsMenu() -->构建菜单页面的布局,和onOptionsItemSelected()–>点击菜单的回调事件
@Override public boolean onCreateOptionsMenu(Menu menu) { //从item_menu.xml中构建菜单页面布局 getMenuInflater().inflate(R.menu.item_menu,menu); return true; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int v = item.getItemId(); if (v==R.id.item_home){ Toast.makeText(this, "点击了首页", Toast.LENGTH_SHORT).show(); return true; }else if (v==R.id.item_quit){ finish(); } return super.onOptionsItemSelected(item); }
3.如果要想让菜单的图标显示,需要重写onMenuOpened()方法
@Override public boolean onMenuOpened(int featureId, Menu menu) { //显示菜单项左侧的图标 MenuUtil.setOverflowIconVisible(featureId,menu); return super.onMenuOpened(featureId, menu); }
其中MenuUtil,我抽离出写成了一个工具类,代码如下:
public class MenuUtil { // 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu // API18以下需要该函数在右上角强制显示选项菜单 public static void forceShowOverflowMenu(Context context) { try { ViewConfiguration config = ViewConfiguration.get(context); Field menuKeyField = ViewConfiguration.class. getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception e) { e.printStackTrace(); } } // 显示OverflowMenu的Icon public static void setOverflowIconVisible(int featureId, Menu menu) { // ActionBar的featureId是8,Toolbar的featureId是108 if (featureId % 100 == Window.FEATURE_ACTION_BAR && menu != null) { if (menu.getClass().getSimpleName().equals("MenuBuilder")) { try { // setOptionalIconsVisible是个隐藏方法,需要通过反射机制调用 Method m = menu.getClass().getDeclaredMethod( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); } catch (Exception e) { e.printStackTrace(); } } } } }
< item >标签常见属性:
android:id:菜单项(MenuItem)的唯一标识。
android:icon:菜单项的图标,在溢出菜单中需要显示图标以及标题,需要额外代码中配置。
android:title:菜单项的标题
android:showAsAction:指定菜单项的显示方式,多个属性值之间可以使用 | 隔开,参数值有
有效值 | 描述 |
always | 在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。 |
ifRoom | 菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。 |
never | 菜单项永远只会出现在溢出菜单中。 |
withText | 无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。 |
collapseActionView | 此选项是在Api14引入的属性,搭配android:actionLayout或者android:actionViewClass使用,可起到折叠视图的效果 |
orderInCategory:组内的重要性顺序
以上便是实现选项菜单的基本步骤和用法,如有不当之处,还望各位加以指正,一起学习,共同进步!