layout_*的一些注意事项

在Android UI的开发中layout_*应该是用的很多的,但其中有很多的坑想必大家也碰到过,今天就来写写自己碰到的!之后如果还有碰到就在添加。

layout_width | layout_height

起因

先来说说起因,做一个自定义的Dialog。这本来是很简单的事情,以前也做过很多次包括PopupWindow。可能是之前到处借鉴别人的代码,没怎么注意,今天自己动手写。出现了个之前出现却没仔细解决的问题!然后就花了一下午甚至还去stackoverflow上提了一发问,不得不说国外的环境就是比国内的好。国内的论坛”杂鱼”太多。真正好好回答你问题的没几个!但也不乏有细心的大神指导~
问题描述见stackoverflow:
http://stackoverflow.com/questions/37854419/why-can-android-alertdialogs-width-and-height-1

问题描述

看了stackoverflow的人应该知道我出现了什么样的问题,问题总的来说是4个:
- 问题1:我在AlertDialog实例化的时候,直接获取其高度和宽度,结果得到-1 ,出现-1的原因
- 问题2:setLayout必须在dialog.show()之后执行,理由是?
- 问题3:getWindow.setLayout(int width, int height)这里widthheight的单位是什么?
- 问题4:为何xml文件中的LinearLayout中的layout_widthlayout_height没有起到作用!

问题解决

问题1:

AlertDialog实例化AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setView(view).create();后,AlertDialog并没有真正被创建。只有当dialog.create()[API 21才允许使用]和dialog.show()之后才真正被创建。所以当我这个时候去获取它的高度和宽度的时候会得到”-1”,这个“-1”是有深意的

        @Deprecatedpublic static final int FILL_PARENT = -1;/*** Special value for the height or width requested by a View.* MATCH_PARENT means that the view wants to be as big as its parent,* minus the parent's padding, if any. Introduced in API Level 8.*/public static final int MATCH_PARENT = -1;/*** Special value for the height or width requested by a View.* WRAP_CONTENT means that the view wants to be just large enough to fit* its own internal content, taking its own padding into account.*/public static final int WRAP_CONTENT = -2;

“-1”即全屏。默认是全屏的。如果我们把

     WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();Log.d("TAG", "First lp width and height" + lp.width + "  " + lp.height);

我门得到的结果为“-2“。至于为何我也不知所以!

问题2

问题2和问题1是一样的问题,同样是由于Dialog还未生成,所以在.show()之后,setLayout()是可以起到作用的!

问题3

这里的int widthint height都是px单位的。可以看到我设置了TextView的高度和宽度分别是200dp设置了Dialog的高度和宽度分贝是500px则会出现下面的效果:

发现200dp500px差的不多。

问题4

这个问题就很高深了,具体为啥是由国外友人告诉我的。

layout_ prefixed attributes are set on a LayoutParams object provided by parent view. Since there’s no parent, there are no LayoutParams you can work with. Try setting android:minHeight and android:minWidth instead.

国外友人说的很详细,layout_*这个属性要能使用必须有父视图(父布局)。如果你不是很懂(其实我也不是很懂),看看郭神的这篇博客可能会有点体会:
http://blog.csdn.net/guolin_blog/article/details/12921889

平时我们经常使用layout_width和layout_height来设置View的大小,并且一直都能正常工作,就好像这两个属性确实是用于设置View的大小的。而实际上则不然,它们其实是用于设置View在布局中的大小的,也就是说,首先View必须存在于一个布局中

这也就是为啥有时候在xml那边设置了宽、高,但是却没能在界面中体现出来的某一个原因。

layout_weight

链接在这里:http://blog.csdn.net/cuihaoren01/article/details/51373887

layout_gravity | gravity

  • android:gravity 是用于设置View组建对齐方式。是针对控件里面的元素来说的,用来控制元素在该空间里的显示位置。
  • android:layout_gravity 用于设置Container组建的对齐方式。是针对控件本身而言,用来控制该控件在包涵该控件的父控件的位置。
  • 特殊情况:当我们采用LinearLayout布局时:
    1)当android:orientation = veritical时,android:layout_gravity只有水平方向的设置才起作用,垂直方向的设置是不起作用的
    2)当android:orientation = horizontal时,android:layout_gravity只有垂直方向的设置才起作用,水平方向的设置不起作用。

之后如果还出现什么问题或者Bug的话在补充也希望有人能给我补充!

layout_*的一些注意事项相关推荐

  1. C++ OP相关注意事项

    C++ OP相关注意事项 Paddle中Op的构建逻辑 1.Paddle中Op的构建逻辑 Paddle中所有的Op都继承自OperatorBase,且所有的Op都是无状态的,每个Op包含的成员变量只有 ...

  2. Hashing散列注意事项

    Hashing散列注意事项 Numba支持内置功能hash(),只需__hash__()在提供的参数上调用成员函数即可 .这使得添加对新类型的哈希支持变得微不足道,这是因为扩展APIoverload_ ...

  3. android 读取asset下的文件注意事项

    注意事项:file:后面是三个斜杠,后面是android_asset,在后面就是html的名字.

  4. Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项(转)

    Djang1.8+Python2.0迁移到Django2.0+Python3.6注意事项 参考:https://blog.csdn.net/weixin_40475396/article/detail ...

  5. 【整理】NSTimer使用及注意事项

    一.NSTimer的创建 // 创建一个定时器,但是么有添加到运行循环,我们需要在创建定时器后手动的调用 NSRunLoop 对象的 addTimer:forMode: 方法. + (NSTimer ...

  6. WIN7源码安装Apache和PHP注意事项

    安装注意事项. 你注意下下载PHP,Apache的网站,上面有提示要安装Visual C++库的. Apache2.4.4需要VC10库支持,Microsoft Visual C++ 2010 SP1 ...

  7. html语言书写注意事项,CSS命名规范参考及书写注意事项

    CSS书写顺序 *{ /*显示属性*/ display position float clear cursor - /*盒模型*/ margin padding width height /*排版*/ ...

  8. 安川g7接线端子图_西门子SIWAREX称重模块安装接线注意事项!

    与称重变送器和称重仪表不同,SIWAREX系列称重模块可以直接接收称重传感器输出的mV信号,并与西门子控制系统(包括S7 200/300/1200/ET200M/ ET200S)无缝集成,具有扩展灵活 ...

  9. 前端 重构时需要注意的事项_驾驶式扫地车的功能特点和使用时需要注意事项...

    扫地车 随着经济的发展,人们的生活水平不断提高,对生活环境的要求也越来越高,于是许多工厂.物业.超市.社区.市政单位等开始购买扫地车来进行路面清洁.一是清洗效果好,二是效率高,可以节省人工成本.扫地车 ...

最新文章

  1. 全国志愿信息服务器,全国志愿者服务信息系统官网登录,2020全国志愿者服务信息系统官网登录注册入口预约 v1.0-手游汇...
  2. 使用system函数时应该忽略两个信号
  3. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇
  4. 一次惊险的跳槽面试经历(阿里/美团/头条/网易/有赞...)
  5. UI实用可临摹素材|剖析UI界面设计基本原则!
  6. java8接口写静态方法_Java 8接口更改–静态方法,默认方法
  7. python基础之函数式编程
  8. windows 安装使用luarocks
  9. 图像基础 PSNR 峰值信噪比
  10. 听音室-HIFI入门之10张公认的经典发烧碟
  11. uni-app实现一键登录
  12. python调用手机摄像头识别二维码_JS调用安卓手机摄像头扫描二维码
  13. 如何Deactivate .Net Reflector
  14. 周育如 K.K 音標英文教學 (自然發音)总结
  15. 职场分享--职场中如何做一名优秀的员工
  16. 自动生成带昵称的头像(仿照钉钉头像)
  17. linux下如何启动ice服务器,linux: ICE搭建
  18. Centos7:网络设置+搜狗输入法安装
  19. 虾皮马来西亚热销产品有哪些?
  20. vue中使用vue-qrcode-reader自动检测并解码来自摄像机流的QR码

热门文章

  1. 当年赫赫有名的“四大工学院”,如今都发展得怎样?依然牛气冲天!
  2. flash动画------豹子奔跑
  3. JS中的批量替换---.replace(/\/g,@);
  4. IDEA中展开包结构的方法
  5. 前端|Layui实现表单
  6. thinkphp5 验证码跨域/验证失败 问题解决方案
  7. 启动RabbitMQ成功但是访问localhost:15672无法访问解决方案
  8. 2021天津高考高中成绩查询系统,2021天津地区高考成绩排名查询,天津高考各高中成绩喜报榜单...
  9. SpringMVC 程序开发
  10. 中间件---Binlog传输同步---Canal