最近做项目时,当我把从一个1280*800分辨率的A平板上做好Demo后移植到另一个同样分辨率的B平板上时,UI(一个自定义的Dialog)尺寸和位置未生效,但在A平板上正常显示。
由于在A上的Dialog尺寸在布局文件中定义,我一开始以为是布局文件未生效,然后想着试试能不能通过用代码动态设定布局大小来解决这一问题,于是我尝试在Dialog创建时加入如下代码(但并没起作用。。。):
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate_SpeechDialog");
setContentView(R.layout.speech_dialog_root);
//注意,要放到setContentView后面。
WindowManager.LayoutParams params = getWindow().getAttributes();
WindowManager windowManager = getWindow().getWindowManager();
Display display = windowManager.getDefaultDisplay();//获取屏幕当前参数值
params.width = display.getWidth();//设置Dialog宽度为当前屏幕宽度
params.height = (int) (display.getHeight() * 0.3375);//设置Dialog高度为当前屏幕高度的0.3375
params.gravity = Gravity.BOTTOM;//设置Dialog在屏幕底部显示
getWindow().setAttributes(params);//向WindowManager设置属性
}
设置失败后,通过进一步分析UI显示流程,发现在show()方法中会调用generateLayout(),利用其中的setLayout(WRAP_CONTENT,WRAP_CONTENT)重置控件大小(这是个坑啊,如果在show方法之前使用的话,之前设置的属性会被重置)。针对这一执行逻辑,我本以为把对Dialog的动态加载过程放在了show()方法后面便可生效,但实际结果是,Dialog尺寸还是没变。。。
很纳闷,为什么在A平板上可以,在B上就不行呢。都是1280*800啊。。。难道是项目经理和视觉交互给的答案都不对?B平板不是1280*800?于是用如上代码中的display.getWidth()和display.getHeight()方法把屏幕尺寸打印出来。结果是1280*752。。。
仔细看两个平板的差别,原来B平板底部多了个上图所示的Bar控件,占用了1280*48的像素位置,所以最终的屏幕分辨率(应用可用空间)就成了1280*752。由于我在设计Dialog布局时,尺寸属性用了dimens布局引用,但屏幕实际可用的大小为1280*752,所以检索“values-1280x800”文件失效。。。
于是我将索引文件名进行了修改,最终问题得到解决。。。
以上,这个问题可能对android大神来看不是问题,但也希望能帮到和我一样刚做android遇到此问题的小伙伴。