Android:Layout_weight的深刻理解

Stella981
• 阅读 522

最近写Demo,突然发现了Layout_weight这个属性,发现网上有很多关于这个属性的有意思的讨论,可是找了好多资料都没有找到一个能够说的清楚的,于是自己结合网上资料研究了一下,终于迎刃而解,写出来和大家分享。

首先看一下Layout_weight属性的作用:它是用来分配属于空间的一个属性,你可以设置他的权重。很多人不知道剩余空间是个什么概念,下面我先来说说剩余空间。

看下面代码:

<?xml version="1.0" encoding="utf-8"?>     
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:orientation="vertical"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"         >
     <EditText
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:gravity="left"
         android:text="one"/>
     <EditText
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:gravity="center"
         android:layout_weight="1.0"
         android:text="two"/>
      <EditText
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:gravity="right"
         android:text="three"/>
 </LinearLayout>

运行结果是:

Android:Layout_weight的深刻理解

看上面代码:只有Button2使用了Layout_weight属性,并赋值为了1,而Button1和Button3没有设置Layout_weight这个属性,根据API,可知,他们默认是0

下面我就来讲,Layout_weight这个属性的真正的意思:Android系统先按照你设置的3个Button高度Layout_height值wrap_content,给你分配好他们3个的高度,

然后会把剩下来的屏幕空间全部赋给Button2,因为只有他的权重值是1,这也是为什么Button2占了那么大的一块空间。

有了以上的理解我们就可以对网上关于Layout_weight这个属性更让人费解的效果有一个清晰的认识了。

我们来看这段代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="**"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#ff0000"
        android:text="1"
        android:textColor="@android:color/white" />

    <TextView
        android:layout_width="**"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:background="#cccccc"
        android:text="2"
        android:textColor="@android:color/black" />

    <TextView
        android:layout_width="**"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:background="#ddaacc"
        android:text="3"
        android:textColor="@android:color/black" />

</LinearLayout>

三个文本框的都是  layout_width=“wrap_content  时,会得到以下效果

Android:Layout_weight的深刻理解

按照上面的理解,系统先给3个TextView分配他们的宽度值wrap_content(宽度足以包含他们的内容1,2,3即可),然后会把剩下来的屏幕空间按照1:2:3的比列分配给3个textview,所以就出现了上面的图像。

而当layout_width=*fill_parent*”时,如果分别给三个TextView设置他们的Layout_weight为1、2、2的话,就会出现下面的效果:

Android:Layout_weight的深刻理解

你会发现1的权重小,反而分的多了,这是为什么呢???网上很多人说是当layout_width=*fill_parent*”时,weighth值越小权重越大,优先级越高,就好像在背口诀

一样,其实他们并没有真正理解这个问题,真正的原因是Layout_width="fill_parent"的原因造成的。依照上面理解我们来分析:

系统先给3个textview分配他们所要的宽度fill_parent,也就是说每一都是填满他的父控件,这里就死屏幕的宽度

那么这时候的剩余空间=1个parent_width-3个parent_width=-2个parent_width (parent_width指的是屏幕宽度 )

那么第一个TextView的实际所占宽度应该=fill_parent的宽度,即parent_width + 他所占剩余空间的权重比列1/5 * 剩余空间大小(-2 parent_width)=3/5parent_width

同理第二个TextView的实际所占宽度=parent_width + 2/5*(-2parent_width)=1/5parent_width;

第三个TextView的实际所占宽度=parent_width + 2/5*(-2parent_width)=1/5parent_width;所以就是3:1:1的比列显示了。

这样你也就会明白为什么当你把三个Layout_weight设置为1、2、3的话,会出现下面的效果了:

Android:Layout_weight的深刻理解

第三个直接不显示了,为什么呢?一起来按上面方法算一下吧:

系统先给3个textview分配他们所要的宽度fill_parent,也就是说每一都是填满他的父控件,这里就死屏幕的宽度

那么这时候的剩余空间=1个parent_width-3个parent_width=-2个parent_width (parent_width指的是屏幕宽度 )

那么第一个TextView的实际所占宽度应该=fill_parent的宽度,即parent_width + 他所占剩余空间的权重比列1/6 * 剩余空间大小(-2 parent_width)=2/3parent_width

同理第二个TextView的实际所占宽度=parent_width + 2/6*(-2parent_width)=1/3parent_width;

第三个TextView的实际所占宽度=parent_width + 3/6*(-2parent_width)=0parent_width;所以就是2:1:0的比列显示了。第三个就直接没有空间了。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
javaweb之jsp的属性范围
1.什么是jsp的属性范围?所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以保存并继续使用。jsp提供了四种属性范围,如下:当前页,对应的jsp对象为pageContext,属性的作用范围仅限于当前JSP页面,跳转到其他页面无法取得。一次服务请求,对应的jsp对象为request,属性的作用范围仅限于同一个请求。
Souleigh ✨ Souleigh ✨
4年前
Js中 constructor, prototype, __proto__ 详解
本文为了解决以下问题:__proto__(实际原型)和prototype(原型属性)不一样!!!constructor属性(原型对象中包含这个属性,实例当中也同样会继承这个属性)prototype属性(constructor.prototype原型对象)__proto__属性(实例指向原型对象的指针)<br/首先弄清楚几个概念:<br/
Wesley13 Wesley13
3年前
Android系统篇之
一、前言今天我们开启Android系统篇的文章了,其实一直想弄,只是之前一直没有太多深入的了解,最近又把这块拿出来好好看了一下,所以想从新梳理一下,来看看Android中的这块知识,首先我们今天来看一下:Android中的智能指针的概念,为什么说先看一下智能指针这个知识呢?因为我们在看Android源码的时候,会发现几乎好多地方都用到了这个东东
Stella981 Stella981
3年前
Android Property Animation
属性动画系统是一个健壮的框架,它使你几乎能够将任何东西做成动画。你可以定义一个动画来随着时间改变任何对象属性,而不管它是否会被绘制到屏幕上。一个属性动画在一个特定的时间长度中改变一个属性的值(一个对象中的一个成员)。当这个属性会影响到屏幕上绘制的组件时,也就产生了我们看得到的那类动画了。要动画化一些东西,你可以指定你想要动画化的对象属性,比如一个对象在屏幕上
Wesley13 Wesley13
3年前
Java之关于This的用法
      用类名定义一个变量的时候,定义的应该只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法,那们类里面是够也应该有一个引用来访问自己的属性和方法纳?呵呵,JAVA提供了一个很好的东西,就是this对象,它可以在类里面来引用这个类的属性和方法。先来个简单的例子:public class ThisDemo {   
Stella981 Stella981
3年前
Android studio新建文件出现setContentView(R.layout.activity_main);中的R标红错误解决方法
今天打开Androidstudio突然出现了setContentView(R.layout.activity\_main);中的R标红错误,这已经不是第一次出现这个错误了,真心的觉得Androidstudio是真的不稳定,找了半天发现我的资源文件res下面的好多文件出现了乱码,(我也是醉了)。把他们一个一个的替换成正确的代码终于rebulidproje
Stella981 Stella981
3年前
Android应用如何监听自己是否被卸载
Android应用如何监听自己被卸载呢,Android系统没有提供这个回调方法。想想感觉是不可能监听到的,自己的代码都被卸载掉了,怎么来执行操作来监听呢。后来看到360这个流氓大哥,还真实现了,还挺稳定的。于是,在网上各种搜索。网上还是有很多人讨论,说怎么怎么着,来弄。我也是研究了很久。网上的方案总结说来有1.广播,只能监听到别人卸载。自己被
Wesley13 Wesley13
3年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢
Wesley13 Wesley13
3年前
mysql数据库优化
引言:关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助1、选取最适用的字段属性MySQL可以很好的支持大数据量的
融云IM即时通讯 融云IM即时通讯
11个月前
使用 CallLib SDK 时,如何设置主叫方视图在被叫方视图上面
可以通过设置组件style的方式让被叫方的视图上面显示主叫方的视图,唯一要注意的一点是,android在setVideoView时需要设置一个属性isZOrderOnTop,这个属性控制是否置顶。