博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
点击跳转到网站
先看下效果:
菜单在程序中使用颇为广泛,几乎所有的桌面应用都含有菜单。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:组内的重要性顺序
以上便是实现选项菜单的基本步骤和用法,如有不当之处,还望各位加以指正,一起学习,共同进步!