LinearLayout含2个View,隐藏一个后另一个无法居中问题求助
首先,咱们先排查几个最容易踩坑的点,这些也是我碰到类似问题时的常见原因:
1. LinearLayout本身的尺寸没占满父布局
如果你的LinearLayout是横向布局,layout_width设为wrap_content,那当其中一个View设为GONE后,LinearLayout的宽度会自动收缩到剩下那个View的宽度——这时候就算你给View设置了居中,看起来也跟没居中一样,因为容器本身就和View一样宽,没多余空间让它居中。
解决办法:把LinearLayout的layout_width(横向布局)设为match_parent,或者layout_height(纵向布局)设为match_parent,让容器占满父布局的可用空间。
2. 剩余View的layout_weight和尺寸设置不匹配
假设是横向布局,如果你想让剩余的View占满容器并居中,那这个View的layout_width应该设为0dp,同时给它设置layout_weight="1",并且把LinearLayout的weightSum设为1(当另一个View GONE后)。如果layout_width还是wrap_content,weight的计算逻辑会混乱,导致View无法正确填充容器,自然也没法居中。
举个正确的布局示例(横向):
<LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:weightSum="2"> <TextView android:id="@+id/tv1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView 1"/> <TextView android:id="@+id/tv2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView 2"/> </LinearLayout>
然后在代码里设置GONE时,更新weightSum并触发重新布局:
if (需要隐藏tv2) { tv2.setVisibility(View.GONE); container.setWeightSum(1); } else { tv2.setVisibility(View.VISIBLE); container.setWeightSum(2); } container.requestLayout(); // 确保布局重新计算
3. 没有正确设置LinearLayout的gravity
别忘了给LinearLayout加上android:gravity="center"(或者对应方向的center_horizontal/center_vertical),这个属性是控制子View在容器内的对齐方式的。如果没加这个,就算容器占满了父布局,子View也会默认左对齐(横向)或者上对齐(纵向)。
4. 调试时的分支逻辑问题
你提到进入ELSE分支时只显示第一个TextView且不居中,那要检查ELSE分支里是不是误把第二个View设为了GONE,或者weightSum的设置值不对。比如如果ELSE分支是两个View都显示的情况,weightSum应该设回2,同时第二个View要设为VISIBLE。
总结一下,最可能的原因就是LinearLayout的尺寸没设为match_parent,或者剩余View的layout_width不是0dp导致weight没生效。你可以先检查这两点,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者rosu alin

