layout_gravity失效的原因解析

相信对于Android的初学者来说,大家都曾经被layout里这两个极其相似的属性迷惑过。& x7 l+ P( V5 ?# `- o
简单使用一下搜索工具,我们就不难找到下面这样的答案:
layout_gravity 表示组件自身在父组件中的位置, Y7 Y, |7 v0 l' J1 Z
gravity 表示组件的子组件在组件中的位置
看似很简单嘛~
貌似大伙瞅一眼就明白了。今天我要说的就是这貌似瞅一眼就明白的道理。
为什么这么简单的道理,总有同学会发现,在“某些时候”,layout_gravity这个属性不好使了,失去了它应有的作用。
于是同学们又开始使用搜索工具,一边还不停的骂:Google做的这个layout真他妈的不好使!
下面我们就网上找来的一个例子来简单描述一种layout_gravity失效的情况。
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- android:gravity设置了按钮上面的文字的显示位置,而android:layout_gravity设置了按钮在布局中的显示位置。 -->
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical" ; c6 e% x5 @$ Z- n* l. q
  5. android:layout_width="fill_parent"! F' v. Rn5 |# ^* P9 D: Q
  6. android:layout_height="wrap_content">$ H0 o2 S- R7 V6 a4 L
  7. <Button android:layout_width="250dip" / Q8 i5 }" o! c) h4 }
  8. android:gravity="right"
  9. android:layout_height="wrap_content"
  10. android:text="我居右显示"
  11. android:layout_gravity="right" />- n0 Z' V, G: l& O' ~
  12. </LinearLayout>
复制代码
这段代码的展现效果如下:


然后我们再看下面这段代码:
  1. <?xml version="1.0" encoding="utf-8"?>9 o1 r/ ]5 ^2 j
  2. <!-- android:gravity设置了按钮上面的文字的显示位置,而android:layout_gravity设置了按钮在布局中的显示位置。 -->3 J( G9 T0 _& e' _6 A1 v1 K( G: a$ K
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"7 a& }& f( A( T% V/ r8 p
  5. android:layout_height="wrap_content">
  6. <Button android:layout_width="250dip"
  7. android:gravity="right"& Z$ {5 t6 R, o$ a( K
  8. android:layout_height="wrap_content"3 T/ E- f. ?3 ^$ f. p: I8 _7 y. X
  9. android:text="我居右显示"% b6 E2 W0 ?9 h. {. b
  10. android:layout_gravity="right" />& s6 C2 ~5 a3 b
  11. </LinearLayout>
复制代码
这段代码我们一样设置了android:layout_gravity="right",但是它的展现效果却是下面这样的:

! M0 m9 F' h9 ?
于是我们前面所说的情况就发生了,“Google做的这个layout真他妈的不好使!”* y1 g6 ^* K6 d: B8 ]

问题究竟出在哪里了呢?
细心一点的同学就会发现,下面的这段代码,最外层的LinearLayout少了这样一个属性: androidrientation="vertical"
不错,正是缺少了这个属性才导致了android:layout_gravity="right"的失效。, H1 Z4 c; I0 E" X0 m
因为LinearLayout默认的是:android rientation=" horizontal" ( q1 @% j$ i- F8 o1 ~: cY! ]% t
也就是说,只有在作为父layout的LinearLayout是 androidrientation="vertical" 的时候,android:layout_gravity="right"才会生效。
7 T4 n1 n( XA. l$ k; Q+ j
到这里本次“讲座”可以结束了吗? No!
6 z, |' [4 P6 q1 h
看完上面的内容,有同学也许还会发现,当外层的LinearLayout为 androidrientation="vertical" 的时候,android:layout_gravity="bottom"失效了!!!, ^9 y, th* R* o6 W# J+ P: {: i

看到这里相信大家都明白了
下面我们还需要做一个简单的总结:
当作为父layout的LinearLayout的属性为 androidrientation="vertical" 的时候,android:layout_gravity="?"这里设为横向的时候才能生效。比如:left,right,center_horizontal等;
当作为父layout的LinearLayout的属性为 androidrientation="horizental" 的时候,android:layout_gravity="?"这里设为纵向的时候才能生效。比如:top,bottom,center_vertical等;
有一个比较特殊的是center,不管是横向还是纵向的时候,它总有一个方向起作用
另外有几个别急面生的:fill_vertical,fill_horizontal,fill,clip_vertical,clip_horizontal
这几个以前没留意过,莫非是新版本的SDK中,新引进的?分散对齐?很迷惑。
有用过的同学还请不吝赐教一下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值