我们在写布局文件的时候可能经常会遇到layout_gravity失效的情况,遇到这种毫无报错的bug简直会令人抓狂,接下来,就让我们一起来剖析一下这个bug。
首先,我们先来看一下这两个属性的功能:
1)android:gravity属性:控制的是该组件的子组件在组件中的位置;
2)android:layout_gravity属性:控制的是该组件自身在父组件中的位置;
简言之,在父控件中设置android:gravity = "?"与在子控件中设置android:layout_gravity = "?"(?可以指right,left,center_horizontal,m,center_vertical等值)应该起到相同的效果,但是事实并不是这样;
我们来看下面这一段代码,这段代码在父布局中指定android:gravity属性为right:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="right" tools:context=".QuizActivity" > <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="50dp" /> </LinearLayout>
它(android:gravity)的运行结果是正常的:
但是接下来,我们在LinearLayout的子组件中指定它的android:layout_gravity属性为right,理论上来说这两个的效果应该是一样的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".QuizActivity" > <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:textSize="50dp" /> </LinearLayout>但是,实际上它的运行结果为:
子控件中的android:layout_gravity属性失效了;
这是为什么?
因为LinearLayout布局的默认android:orientation属性为horizontal;
经过多次试验,我发现android:gravity属性总能够生效,
而子控件的android:layout_gravity属性与LinearLayout的android:orientation属性的关系为:
1)当你的android:orientation属性指定为vertical时,该属性的一些纵向的值就会失效, 例如:top,bottom,center_vertical,另一些横向的值才会起效果,例如:right,left,center_horizontal 2)当你的android:orientation属性指定为horizontal时,该属性的一些横向的值就会失效, 例如:right,left,center_horizontal,另一些纵向的值才会起效果,例如:top,bottom,center_vertical
本文深入解析了在布局文件中使用layout_gravity属性时遇到的bug,特别是当其在父布局和子组件中应用时的差异表现,并通过代码实例详细解释了原因。重点在于理解LinearLayout的默认orientation属性如何影响layout_gravity属性的生效。

574

被折叠的 条评论
为什么被折叠?



