LinearLayout布局中的gravity与layout_gravity之惑

本文深入解析了在布局文件中使用layout_gravity属性时遇到的bug,特别是当其在父布局和子组件中应用时的差异表现,并通过代码实例详细解释了原因。重点在于理解LinearLayout的默认orientation属性如何影响layout_gravity属性的生效。

我们在写布局文件的时候可能经常会遇到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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值