您的位置:首页 > 其它

LinearLayout布局中的gravity与layout_gravity之惑

2016-01-15 16:43 232 查看
我们在写布局文件的时候可能经常会遇到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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: