在800x480下运行6575模拟器报错,而在低分辨率下没有问题,第一感觉,程序应该是没多大问题的,应该是资源的问题。打开DDMS,跟踪到错误信息是ArrayList下标超出范围,找到对应的

代码:

if (slotId == Phone.GEMINI_SIM_1)
{
    mLastDataTypeIconId = tempDataTypeIconId;
    v = mDataTypeconViews.get(0)
} else
....

程序没有防范措施,可见程序默认这里面必须有一个Item,加下

if (mDataTypeconViews.Size() >= 0) 防范处理后,虽然不报错,但系统显示不正确,所以还得查找根源。

经过一番跟踪,发现给mDataTypeconViews(ArrayList)填充的值来源于一个Layout上的控件(通过findId),于是查看资源(/frameworks/base/packages/SystemUI/res),发现两个问题:

1.程序中指定的布局 status_bar_notifications_panel没有在通用目录: layout或layout-port中实现,而存在于特定的屏幕:layout-sw600dp中。

2.很大一部分图标在 drawable-hdpi和drawable-mdpk中有(430个),而在drawable-xhdpi中只有140来个。

问题已经很清晰了:
运行的模拟器800X480很显然属于高分辨率,而系统自动适drawable-xdpi中的图标,android系统中,图片资源只能从高往低适配(例如,mdi中没有,就找hdpi中的图片),或从通用往特定适

配(drawable可以适应drawable-mdpi或drawable-hdpi等等),但不会从低往高适配,而drawable-xdpi要求的显示要比drawable-hdpi高一个层次,所以就出错了。

layout也有同样的问题。

解决办法:
在res下,将drawable-hdpi下的所有图标复制到drawable-xdpi(不要覆盖原来的)。将layout-sw600dp下的内容复制到 layout。重新编译资源和程序,并打包systemimage(make snod),模拟

器运行正常。