在android3.0以上的版本中,引入actionbar这个新功能,替代3.0之前的标题栏,并提供了更为丰富的导航效果。但是这个新功能并不是在所有的手机上都有一致的效果,比如在actionbar空间有限的情况下多余的action item会使用overflow menu将其隐藏起来,我们可以点击它显示出来,但是在有menu键的情况下,就不会显示这个overflow menu,以及在3.0以下版本中的根本就没有actionbar,这就造成在不同的手机,不同版本的显示不一致的情况,给用户造成很大的麻烦, 这篇博文就是为了解决在这些情况,至少解决绝大部分的问题。
在微信中,不管在什么版本的手机上都能显示overflow menu这个菜单,便于用户操作,效果如下:
在默认的actionbar中,有menu按键的手机是不会显示这个overflow menu菜单的,需要通过menu键将其呼出了,很多用户都不知道,还有这个功能,要解决这个功能,我们只需要自定义一个Application:
public class UIApplication extends Applications{ public void onCreate() { try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ex) { // Ignore } super.onCreate(); } }然后在AndroidManifest.xml中修改application段的android:name=".UIApplication"这样在所有的activity都会显示 overflow menu菜单。
这是android4.0以上的手机,可以通过这个方法解决,但是在android4.0一下就不行了。对android有一定的了解的开发者,一定知道Actionbarsherlock这个库,不错,它正是解决了在android4.0一下的版本中也能使用actionbar而产生的,不过也可以使用google官方的actionbar_compat兼容包。但是这也有同样的问题,就是在有menu键的手机上还是有问题,而且大部分android4.0以下的手机都有menu键,这确实是个棘手的问题,在4.1.2版本的actionbarsherlock上是有forceOverflow的选项可以进行设置的,但是之后就没有,但是不能对actionbarsherlock进行升级。
在这里我是用PopupWindow来解决这个问题
首先我们先去github下载一个库,https://github.com/mcxiaoke/PopupMenuCompat这是一个兼容android所有版本的弹出菜单,首先,我们看这个库提供的demo效果图:
这是在android2.3上的效果图,是不是很像actionbar上隐藏菜单,我们就在这个上面进行改造。
1、把demo里面Samples activity继承于SherlockActivity,修改AppTheme.Light的parent值为@style/Theme.Sherlock.Light,否则会报错,现在的如下:
上面的actionbar显示出来了。
2、在这个actionbar上手动加上一个overflow menu。在menu文件夹中新建一个main.xml内容如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actionbarpopu.MainActivity" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:icon="@drawable/abs__ic_menu_moreoverflow_normal_holo_light" android:title="更多" android:showAsAction="always"/> </menu>在activity中添加如下代码:
@Override public boolean onCreateOptionsMenu(Menu menu) { getSupportMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_overflow) { View view = findViewById(id); showPopupMenu(view); return true; } return super.onOptionsItemSelected(item); }现在效果如下:
这是不是就是我们所要的效果,大家注意这是在android2.3的模拟器上哦!
3、但是现在还有个问题,就是不能响应menu键,我们继续修改,在activity中加上如下代码:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN) { View view = findViewById(R.id.action_overflow); showPopupMenu(view); return true; } return super.onKeyDown(keyCode, event); }现在我们按menu键可以弹出隐藏菜单了,但是在弹出菜单以后 按menu键却不能消失,这时我们需要修改库项目中的ListPopupWindowCompat.java文件,在buildDropDown()方法中添加
mDropDownList.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_DOWN) { if (mPopup != null && mPopup.isShowing()) { mPopup.dismiss(); return true; } } return false; } });位置如下:
现在可以使用menu键进行操作了。
大功告成了,现在android4.0一下是可以了,但是android4.0以上也可以用这个,但是弹出菜单以后按menu键却不能消失,有两种解决方案,第一种就是按照前面的思路,做下判断就行,第二种就是Activity中做相应菜单消失的事件监听就行了,我就不写,应该很容易的。
现在我把所有的代码打包上传!http://download.csdn.net/detail/lovexieyuan520/7639797