layout_weight属性的用法和意义

一直没理解在LinearLayout中的layout_weight属性的意义,使用的时候都是将子控件的layout_width或者layout_height设置为0,然后在设置layout_weight的权重值,以至于在被问到如果设置了layout_width为具体的值时对layout_weight的影响时一脸懵逼。然后看到了这篇文章,终于豁然开朗。

原来layout_weight属性的意义就是将父控件的剩余空间按照设置的权重比例再分配,也就是在布局的时候,系统先按照view的layout_width和layout_height来布局,然后再根据layout_weight对view的位置进行调整。

贴下原文内容:

指示LinearLayout中多少额外空间分配给与这些LayoutParams关联的视图。 如果视图不应被拉伸,请指定0。 否则,额外空间将在权重大于0的所有视图中按比例分配。

上面有几点:

1.额外空间,指的是剩余空闲空间, 额外空间将在权重大于0的所有视图中按比例分配。

如下,总权重为1+1=2

第一个控件是比第二个控件占的空间小的,即w(12345)+1/2空闲空间< w(123456)+1/2控件

<LinearLayout 
  android:orientation="horizontal">
  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="12345"/>
 
  <TextView 
      android:layout_width="wrap_content"
      android:layout_height="wrap_height"
      android:layout_weight="1"
      android:text="123456"/>
</LinearLayout>
如果我们让控件的宽度定义为layout_width="0dp" ,这样比如2个控件的 layout_weight="1" 就可以各自50%平分整个空间了,因为:0 + 1/2空闲空间 = 0 + 1/2空闲空间。

2.默认layout_weight为0,所以如果这么写:

<LinearLayout 
    android:orientation="horizontal">
 
    <TextView
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:background="#000" />
 
    <Button
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
 
    <TextView
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:background="#888" />
 
</LinearLayout>
则总权重为1,即Button占了所有剩余空闲空间,无论它在哪个位置

3.在排列方向上设置了match_parent, 如下,权重为2,1,2

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:text="1"
            android:layout_weight="2"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="2"
            android:layout_weight="1"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="3"
            android:layout_weight="2"/>
运行结果如下:

分析:因为设置的都是match_parent,所以如果没有设置权重,三个Button只会显示第一个,其他会被覆盖,但是设置了权重后, 我们就按三个Button给定的width=match_parent计算剩余空间

剩余空间=1个match_parent空间-3个match_parent空间= -2个match_parent空间(负2)

所以

Button1所占空间 = 1个match_parent空间+(-2个match_parent空间)*2/5 = 1/5个match_parent空间

Button2所占空间 = 1个match_parent空间+(-2个match_parent空间)*1/5 = 3/5个match_parent空间

Button3所占空间 = 1个match_parent空间+(-2个match_parent空间)*2/5 = 1/5个match_parent空间

所以在统一设置match_parent时,会有这么一个特性,权重越大,空间越小。

而且在某个控件权重刚好为另外的所有控件权重之和时,这个控件会消失。

如权重变为1,2,3

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content" 
            android:text="1"
            android:layout_weight="1"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="2"
            android:layout_weight="2"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="3"
            android:layout_weight="3"/>
运行结果如下:

同样的算法:

Button1所占空间 = 1个match_parent空间+(-2个match_parent空间)*1/6 = 2/3个match_parent空间

Button2所占空间 = 1个match_parent空间+(-2个match_parent空间)*2/6 = 1/3个match_parent空间

Button3所占空间 = 1个match_parent空间+(-2个match_parent空间)*3/6 = 0个match_parent空间
 

剩余布局大小 = 父布局大小 - 子布局大小之和

  • 50
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
回答: 当出现"pull 分支报错 fatal: Need to specify how to reconcile divergent branches"的错误时,这意味着在合并分支时存在冲突,需要指定如何解决这些冲突。在SourceTree中,有几种方法可以解决这个问题。 一种方法是使用回滚提交。回滚提交是指将分支恢复到之前的某个提交状态。在SourceTree中,你可以切换到线上分支,然后找到要回滚的提交记录,右击该提交记录,选择回滚,然后点击确定即可。这样就可以将分支恢复到指定的提交状态。\[2\] 另一种方法是重置当前分支到某个提交。重置当前分支是指将当前分支的指针移动到指定的提交,丢弃之后的提交记录。在SourceTree中,你可以切换到线上分支,然后找到要重置的提交记录,右击该提交记录,选择重置,然后点击确定即可。这样就可以将当前分支重置到指定的提交状态。\[2\] 如果你只需要合并某个分支的部分代码,可以使用遴选方式。具体操作是,在开发分支的提交记录上找到要遴选到线上分支的那条提交记录,右击该提交记录,选择遴选,然后点击确定即可。这样就可以将指定的提交记录合并到线上分支中。\[3\] 希望以上解答对你有帮助。 #### 引用[.reference_title] - *1* *2* *3* [【Git】常用命令和sourceTree的使用](https://blog.csdn.net/sj13036141506/article/details/128708160)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值