前言
当新建android工程后,发现原来使用的ActionBar的屏幕右上角的三个点不再出现了(如图中3),它是因为什么原因不在出现了呢?如果不是我自己的原因,那怎么才能搞出来。这个问题通过下面的方式已经得到了解决。
大概意思也就是说安卓也在不断地进化中,有些东西可能被慢慢替代掉,从 Android 3.0(API 级别 11)开始,采用 Android 技术的设备不必再提供一个专用“菜单”按钮。可以参考sHasPermanentMenuKey()方法的源码解释:
Report if the device has a permanent menu key available to the user.
As of Android 3.0, devices may not have a permanent menu key available.
Apps should use the action bar to present menu options to users.
However, there are some apps where the action bar is inappropriate
or undesirable. This method may be used to detect if a menu key is present.If not, applications should provide another on-screen affordance to access functionality
关键点:在onCreate()方法中添加下面的方法:他的作用是通过反射的方式获取sHasPermanentMenuKey()方法,这个方法的作用该方法可用于检测菜单键是否存在,并可强制让其可见。
try {
ViewConfiguration config = ViewConfiguration.get(this);//得到一个已经设置好设备的显示密度的对象
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");//反射获取其中的方法sHasPermanentMenuKey(),他的作用是报告设备的菜单是否对用户可用,如果不可用可强制可视化。
if (menuKeyField != null) {
//强制设置参数,让其重绘三个点
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
实现步骤:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getOverflowMenu();//添加方法
}
private void getOverflowMenu() {
try {
ViewConfiguration config = ViewConfiguration.get(this);//得到一个已经设置好设备的显示密度的对象
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");//反射获取其中的方法sHasPermanentMenuKey(),他的作用是报告设备的菜单是否对用户可用,如果不可用可强制可视化。
if (menuKeyField != null) {
//强制设置参数,让其重绘三个点
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 填充menu的main.xml文件; 给action bar添加条目
getMenuInflater().inflate(R.menu.main, menu);
menu.add(0, 0, 1, "备注1");// 相当于在res/menu/main.xml文件中,给menu增加一个新的条目item,这个条目会显示title标签的文字(如备注1)
menu.add(0, 1, 2, "备注2");//第二个参数代表唯一的item ID.
menu.add(0, 2, 3, "备注3");
menu.add(0, 3, 4, "备注4");
return true;
}
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/action_settings01"
android:icon="@drawable/ic_favorite_black_48dp"
android:title="@string/action_settings01"
android:showAsAction="ifRoom"/>
<item android:id="@+id/action_settings02"
android:title="@string/action_settings02"
android:icon="@drawable/ic_favorite_black_48dp"
android:title="@string/action_settings01"
android:showAsAction="ifRoom"/>
<item android:id="@+id/action_settings02"
android:title="@string/action_settings02"
android:showAsAction="ifRoom"/>
<item android:id="@+id/action_settings03"
android:title="@string/action_settings03"
android:showAsAction="ifRoom"/>
menu>
详细解释:
<menu>定义 Menu,即菜单项的容器。<menu> 元素必须是该文件的根节点,并且能够包含一个或多个 <item> 和 <group> 元素。
<item>创建 MenuItem,此元素表示菜单中的一项,可能包含嵌套的 <menu> 元素,以便创建子菜单。
<group>或者<item> 元素的不可见容器(可选)。它支持您对菜单项进行分类,使其共享活动状态和可见性等属性。
< Item >的关键属性showAsAction,代表了Iitem以什么样的方式和什么时机出现在APP的活动条里(ActionBar),如下:
其他的可以关键字可以参阅:https://developer.android.com/guide/topics/resources/menu-resource.html