Android的ActionBar如何强制显示OverFlow图标

在有的Android的App中,若ActionBar中的菜单项过多,会显示一个OverFlow图标(有三个纵向的点)如下图所示:

4.1.2-android-weixin-micromsg-also-show-three-dot-settings-menu_thumb

比较遗憾的是,这个图标的显示,与Android版本以及Menu项的数目相关。

如何强制显示这个Overflow图标呢?

经过查找,有如下两种方案。

1、进行Hack

在onCreate中添加如下Hack代码

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
}
catch (Exception e) {
// presumably, not relevant
}
try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception e) { // presumably, not relevant }
try {
  ViewConfiguration config = ViewConfiguration.get(this);
  Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");

  if (menuKeyField != null) {
    menuKeyField.setAccessible(true);
    menuKeyField.setBoolean(config, false);
  }
}
catch (Exception e) {
  // presumably, not relevant
}

比较遗憾的是,上述所使用的sHasPermanentMenuKey并未在官方文档中提及,也就是说,在未来很可能被废弃。

2、将一个MenuItem“伪装”成Overflow图标

如下所示,我们可以设置一个父子菜单,然后对父菜单设置icon,来完成同样的功能。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/saveDetails"
android:showAsAction="always"
android:title="@string/save"/>
<item
android:id="@+id/menu_overflow"
android:icon="@drawable/dts"
android:orderInCategory="11111"
android:showAsAction="always">
<menu>
<item
android:id="@+id/contacts"
android:showAsAction="never"
android:title="Contacts"/>
<item
android:id="@+id/service_Tasks"
android:showAsAction="never"
android:title="Service Tasks"/>
<item
android:id="@+id/charge_summary"
android:showAsAction="never"
android:title="Charge Summary"/>
<item
android:id="@+id/capture_signature"
android:showAsAction="never"
android:title="Capture Signature"/>
</menu>
</item>
</menu>
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/saveDetails" android:showAsAction="always" android:title="@string/save"/> <item android:id="@+id/menu_overflow" android:icon="@drawable/dts" android:orderInCategory="11111" android:showAsAction="always"> <menu> <item android:id="@+id/contacts" android:showAsAction="never" android:title="Contacts"/> <item android:id="@+id/service_Tasks" android:showAsAction="never" android:title="Service Tasks"/> <item android:id="@+id/charge_summary" android:showAsAction="never" android:title="Charge Summary"/> <item android:id="@+id/capture_signature" android:showAsAction="never" android:title="Capture Signature"/> </menu> </item> </menu>
<?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >


<item
    android:id="@+id/saveDetails"
    android:showAsAction="always"
    android:title="@string/save"/>

<item
    android:id="@+id/menu_overflow"
    android:icon="@drawable/dts"
    android:orderInCategory="11111"
    android:showAsAction="always">
    <menu>
        <item
            android:id="@+id/contacts"
            android:showAsAction="never"
            android:title="Contacts"/>


        <item
            android:id="@+id/service_Tasks"
            android:showAsAction="never"
            android:title="Service Tasks"/>


        <item
            android:id="@+id/charge_summary"
            android:showAsAction="never"
            android:title="Charge Summary"/>


        <item
            android:id="@+id/capture_signature"
            android:showAsAction="never"
            android:title="Capture Signature"/>
    </menu>
</item>

</menu>

这样搞完后,有个缺点,就是submenu会在屏幕顶部显示,而不是actionbar底部显示,经过查询,可以按照这样的方法进行处理,即单独添加submenu。

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *