在android所有版本中一直显示overflow效果的解决方案

       在android3.0以上的版本中,引入actionbar这个新功能,替代3.0之前的标题栏,并提供了更为丰富的导航效果。但是这个新功能并不是在所有的手机上都有一致的效果,比如在actionbar空间有限的情况下多余的action item会使用overflow menu将其隐藏起来,我们可以点击它显示出来,但是在有menu键的情况下,就不会显示这个overflow menu,以及在3.0以下版本中的根本就没有actionbar,这就造成在不同的手机,不同版本的显示不一致的情况,给用户造成很大的麻烦, 这篇博文就是为了解决在这些情况,至少解决绝大部分的问题。

       在微信中,不管在什么版本的手机上都能显示overflow menu这个菜单,便于用户操作,效果如下:

在android所有版本中一直显示overflow效果的解决方案_第1张图片

在默认的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效果图:

在android所有版本中一直显示overflow效果的解决方案_第2张图片

这是在android2.3上的效果图,是不是很像actionbar上隐藏菜单,我们就在这个上面进行改造。

       1、把demo里面Samples activity继承于SherlockActivity,修改AppTheme.Light的parent值为@style/Theme.Sherlock.Light,否则会报错,现在的如下:

在android所有版本中一直显示overflow效果的解决方案_第3张图片

上面的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);
	}
现在效果如下:
在android所有版本中一直显示overflow效果的解决方案_第4张图片

这是不是就是我们所要的效果,大家注意这是在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;
            	}  
            });
位置如下:

在android所有版本中一直显示overflow效果的解决方案_第5张图片

现在可以使用menu键进行操作了。

大功告成了,现在android4.0一下是可以了,但是android4.0以上也可以用这个,但是弹出菜单以后按menu键却不能消失,有两种解决方案,第一种就是按照前面的思路,做下判断就行,第二种就是Activity中做相应菜单消失的事件监听就行了,我就不写,应该很容易的。

现在我把所有的代码打包上传!http://download.csdn.net/detail/lovexieyuan520/7639797

你可能感兴趣的:(android,overflow,menu,PopupMenuCompat)