在weightSum为1的容器中混用layout_weight与wrap_content是否规范?
嘿,这个问题问得特别好,很多刚接触LinearLayout权重的开发者都会有这个疑惑,我来给你捋清楚这里面的逻辑~
首先得纠正一个常见误解:android:weightSum并不是一个严格的“总权重上限”,它更像是一个「参考标尺」,用来帮你更直观地按比例分配剩余空间,而不是限制子元素的总权重不能超过它。
那LinearLayout的权重计算到底是怎么玩的?以你这个垂直布局为例,步骤是这样的:
- 第一步:先给所有没有设置
layout_height="0dp"的子元素分配它们需要的空间——也就是你那个底部的wrap_content LinearLayout,系统会先算出它的实际高度(Button的高度加上容器的内边距之类的),先把这部分空间预留出来。 - 第二步:剩下的父容器空间(父容器是match_parent,所以总高度减去底部栏的高度),再按子元素的
layout_weight比例分配给设置了layout_height="0dp"的子元素。
回到你的布局:
第一个子元素设置了layout_weight="1"和layout_height="0dp",它会把第一步剩下的所有空间都占满;而底部的wrap_content元素已经提前占了自己的位置,所以两个元素自然都能正常显示,完全不会被挤掉。
再说说weightSum的作用:如果你的布局里有多个带权重的子元素,比如两个子元素分别设layout_weight="0.3"和layout_weight="0.7",那设置weightSum="1"就能很直观地看出它们各占剩余空间的30%和70%;但如果不设置weightSum,系统会自动把所有子元素的权重加起来作为总权重(比如两个子元素权重都是1,总权重就是2,各占剩余空间的1/2),效果是一样的,只是可读性差一点。
另外,你用这个布局做可显隐的底部菜单简直太合适了!当底部菜单设置为visibility="gone"时,第一步就不会预留它的空间,第一个子元素就会自动占满整个父容器;当菜单显示时,又会自动让出对应的高度,完美适配这种场景~
你的布局代码我整理成了更易读的格式:
<LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="1" > <LinearLayout android:orientation="vertical" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"> <!-- 这里放主内容 --> </LinearLayout> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Ok" /> </LinearLayout> </LinearLayout>
内容的提问来源于stack exchange,提问作者user4254398

