如何将LinearLayout居中于父布局?Android开发疑难求助
让LinearLayout自身在父布局居中的正确姿势
嗨,我刚看到你的问题,刚好之前也踩过类似的坑,给你梳理下解决方案:
首先得明确核心:你要的是LinearLayout这个容器本身在父布局里居中,而不是它内部的内容居中——这俩是完全不同的属性控制,别搞混了。
为什么android:layout_gravity没效果?
layout_gravity的生效是有前提的:
- 它是作用于当前View在父布局中的对齐方式,所以父布局得是支持这种属性的容器,比如
FrameLayout、RelativeLayout,或者ConstraintLayout; - 同时,你的LinearLayout的宽高不能设为
match_parent——如果它已经占满父布局的宽度/高度,那水平/垂直方向的居中自然看不到效果。
如果你的父布局是LinearLayout,那直接给子LinearLayout加layout_gravity确实可能没效果,得换个方式。
正确的解决方案(分场景)
场景1:用ConstraintLayout(推荐,现在Android官方主推)
这是最省心的方式,不管父布局是啥,只要把你的LinearLayout宽高设为wrap_content(或者你需要的固定尺寸,比如200dp),然后加这四个约束:
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" <!-- 其他属性 --> > <!-- 子视图 --> </LinearLayout>
这样就能让LinearLayout在父布局里完全居中。
场景2:父布局是FrameLayout
直接给LinearLayout加android:layout_gravity="center",同时确保LinearLayout的宽高是wrap_content/固定值:
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" <!-- 其他属性 --> > <!-- 子视图 --> </LinearLayout> </FrameLayout>
场景3:父布局必须用LinearLayout
那给父LinearLayout设置android:gravity="center",然后把你的LinearLayout宽高设为wrap_content/固定值:
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" <!-- 其他属性 --> > <!-- 子视图 --> </LinearLayout> </LinearLayout>
关于你的疑问
- 完全可以用LinearLayout实现这个效果,不是不能用,只是要注意父布局类型和自身宽高的设置;
- 不需要把LinearLayout设为
match_parent再约束子视图——那样会让LinearLayout占满父布局,根本没法让“自身”居中,反而把问题搞复杂了。
最后提醒下:一定要确认你的LinearLayout宽高不是match_parent,这是很多人踩坑的点!
内容的提问来源于stack exchange,提问作者Ben Esposito
相关产品推荐
相关产品推荐

