公司的用户认证SDK项目接了游戏工程在Android 5.0.1系统下测试时出现了一个bug:
使用了SlidingMenu的那个Activity的控件(包括Fragment里的和SlidingMenu里的),会出现问题。具体的表现为ListView的列表项和按钮等点击之后没有看到响应点击的背景色;EditText点击后没看到光标,输入一些字符串后没有显示在EditText里,但滑动一下SlidingMenu后就能显示出字符串了。
经过分析测试,这个bug只有在Android 5.0系统下,并且同时使用SlidingMenu和Cocos2dx的项目才会出现。这个项目在Android 5.0以下的系统运行正常,没有这个bug。而在Android 5.0系统环境,如果不接入Cocos2dx工程,只用SDK的demo跑也正常。
我本以为是焦点的获取问题,但通过Activity.getCurrentFocus()方法是有得到各个控件的焦点的,且点击的事件也有响应。于是去分析SlidingMenu的源码,发现是以下代码的问题。
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void manageLayers(float percentOpen) {
if (Build.VERSION.SDK_INT < 11) return;
boolean layer = percentOpen > 0.0f && percentOpen < 1.0f;
final int layerType = layer ? View.LAYER_TYPE_HARDWARE : View.LAYER_TYPE_NONE;
if (layerType != getContent().getLayerType()) {
mHandler.post(new Runnable() {
public void run() {
Log.v(TAG, "changing layerType. hardware? " + (layerType == View.LAYER_TYPE_HARDWARE));
getContent().setLayerType(layerType, null);
getMenu().setLayerType(layerType, null);
if (getSecondaryMenu() != null) {
getSecondaryMenu().setLayerType(layerType, null);
}
}
});
}
}
上面这段代码是在SlidingMenu类的 最底部,主要的功能是在Android 3.0以上的系统启用硬件加速去绘制滑动的效果。
我推测在Android 5.0系统下,该代码可能和Cocos2dx的绘制冲突了。
解决的办法很简单
把
if (Build.VERSION.SDK_INT < 11) return;
改成
if (Build.VERSION.SDK_INT < 11 || Build.VERSION.SDK_INT > 20) return;