Android:自定义Dialog尺寸失效问题解决经验

    最近做项目时,当我把从一个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遇到此问题的小伙伴。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值