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:
它(android:gravity)的运行结果是正常的:
但是接下来,我们在LinearLayout的子组件中指定它的android:layout_gravity属性为right,理论上来说这两个的效果应该是一样的
但是,实际上它的运行结果为:
子控件中的android:layout_gravity属性失效了;
这是为什么?
因为LinearLayout布局的默认android:orientation属性为horizontal;
经过多次试验,我发现android:gravity属性总能够生效,
而子控件的android:layout_gravity属性与LinearLayout的android:orientation属性的关系为:
首先,我们先来看一下这两个属性的功能:
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
相关文章推荐
- nginx+tomcat影响request值
- 链队列
- Android布局控件之常用linearlayout布局
- jquery获取鼠标位置
- 设计模式(三)
- 安卓实现广告栏图片无限轮播播放效果
- Redis 集群的合纵与连横
- android NDK install and config in ubuntu
- socket通信(一)
- 设置textfeild的属性
- 整理的HTML5 CANVAS 定义、属性和方法
- open_basedir restriction in effect. File() is not within the allowed path(s)
- FreeSWITCH 1.6关于视频通话的一些测试
- android启动另一个app应用
- ViewPagerIndicator简要使用方法
- android系统自带下拉刷新控件的实现
- js判断input是否为空
- OJ 系列之删除字符串中出现次数最少的字符
- 初识《MVC》
- 我看过的