今天在修改一个布局问题时候,发现自己对权重的理解还不够。
首先问题如图:
一个TextView没有按要求显示完整,显示成了2行。
怎么办呢?
- 方法1:是把它左面的字体放小。 结果师兄说不可以随意修改布局的尺寸,否则测试还会提bug。
- 方法2:不让改字体,那就修改边距,图片的margin,textView的magin,统统改了遍。 结果可想而知,这么大的变动更不可以。
- 师兄看我这么愚钝,指点了一下:不修改布局,怎样能让时间不论在什么情况下都显示呢?
- 我的做法:
<TextView
android:id="@ id/teacher_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="张文欣老师回答了您的问题"
android:textColor="@color/color_blackest_text"
android:textSize="@dimen/text_size_mediumer" />
<TextView
android:id="@ id/notice_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:layout_marginLeft="3dp"
android:text="5-16 4:04"
android:textSize="@dimen/text_size_smaller" />
- 显示布局:
- 还是那样。
- 为什么呢? 设置layout_weight = “1”不就是为了保证它在什么情况下都显示吗?怎么回事。
4。师兄看不下去了,亲自示范给我,代码如下:
代码语言:javascript复制 <TextView
android:id="@ id/teacher_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:text="张文欣老师回答了您的问题"
android:textColor="@color/color_blackest_text"
android:textSize="@dimen/text_size_mediumer" />
<TextView
android:id="@ id/notice_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3dp"
android:text="5-16 4:04"
android:textSize="@dimen/text_size_smaller" />
- 哇塞,这次ok了:
虽然一样都是设置layout_weight,但是设置在什么位置就显示出了对它的理解。
我之前的理解一直都是把某个组件的宽或者高设置为0,然后再设置个权重为1,它就会填充所有剩下的空间。事实上很多时候也奏效了。
今天这次让我仔细看了之前的一篇文章【Android入门的常见问题Part1】android:layout_weight的理解,结合这次的问题,好好思考了一下layout_weight的用法。
用法总结:
- 最常见的使用权重都是设置宽或者高为0dp,然后设置权重为1.而且整个布局中只有这一个权重。
- 比如说在一个listView下有个button,listView高度不确定,想让button始终显示,就给listView设置个权重。
- 为什么这么用会有这样的效果呢?
- 首先要明白,layout_weight表示的是对剩余空间的占有比例,我再强调一下,是剩余!
- 既然是挑剩下的,那自然应该先让除他以外的其他组件显示。
- 就比如说开篇的那个问题,想让显示时间的TextView不论何时都显示,就给其他的某个不太重要的组件设置权重,让那个不重要的自己根据剩余空间显示大小。
- 还有的时候我们布局中不仅一个权重,比如说为了屏幕适配,给布局中的所有子组件都设置权重,那么子组件就会占据权重响应的比例。
- 比如说:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@ id/button1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="1"
android:textSize="20sp" />
<Button
android:id="@ id/button2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2"
android:textSize="20sp" />
</LinearLayout>
- button1会占据2/3的位置,button2会占据1/3. - 注意,两个Button的宽度都是0dp
3.在2的情况下,我们设置Button的宽度为wrap_content:
代码语言:javascript复制<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@ id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="1"
android:textSize="20sp" />
<Button
android:id="@ id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2"
android:textSize="20sp" />
</LinearLayout>
- 还是之前强调的,layout_weight分配的是剩余的空间。
- 上述代码中我们将2个按钮的宽度都设为wrap_content,假设他俩宽度都是2,整个布局宽度为10.
- 那么button1实际得到的宽度是:2 (10 -2 -2)*(2/3) = 6
- button2实际得到的宽度是: 2 (10 -2 -2)*(1/3) = 4
4.在3的情况下,我们设置Button的宽度为match_parent:
代码语言:javascript复制<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@ id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="1"
android:textSize="20sp" />
<Button
android:id="@ id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="2"
android:textSize="20sp" />
</LinearLayout>
- 我们看到1和2的比例相反了,为什么呢?
- 上述代码中我们将第一个按钮就设置为match_parent,即填充整个布局。第二个也设置为match_parent,如果没有权重,第二个是不会显示的。
- 如果两个组件所占的空间之和超过了整个空间的大小,假设整个布局的宽度为10,2个按钮由于设置match_parent理论上的宽度也分别为10,这样2个组件超过了空间,该怎么分配呢?
- 超出的部分也按照权重来分,不过是在组件原来占有空间的基础上来减去这个值
- 所以2个按钮实际得到的大小为:
- button1实际得到的宽度是:10-(10 10-10)*2/3=1/3个空间大小
- button2实际得到的宽度是: 10-(10 10-10)*1/3=2/3个空间大小。