想想自己学习android也有一年多了,但是一直没有系统学习,也没有发过一篇关于android的博客,觉得自己android都还没正式入门,今天开始重新学习android,一边看视频教程一边上机实践,并把所学的感悟的心得开贴记录下来。不追求翔实的纪录,只留一些我的思考后的心得,所以读者最好有一点android基础。
今天主要的讲的是布局。
线性布局LinearLayout
属性android:layout_weight
在郭大大的《第一行代码》中给了一个有关layout_weight的小demo,布局代码大致如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id = "@+id/et1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Type something"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Send"
android:visibility="visible" />
</LinearLayout>
其效果如下
注意父LinearLayout布局的方向必须要设置为horizontal(默认值),因为子元素是在水平方向上切分父布局,如果设置为vertical的话子元素因为宽度为0而无法显示。
郭大大说得很明白,但是这里我强调一点的是:子元素切分的是父布局剩下来的空间
比如上面的例子假如我把EditText的宽度设置为50dp而不是0dp,那么EditText先分得50dp后再和Button平分父布局剩下来的宽度(屏幕宽度-50dp),所以EditText比Button宽50dp。
由于安卓的碎片化,手机像素不一,app开发时设置宽高一般用dp而不是px,文字大小用sp
这样一来,郭大大的第二个有关layout_weight的demo也很容易明白了。
android:layout_gravity和android:gravity
它们的共同点是可选值都是top
,bottom
,left
,right
,center_vertical
,center_horizontal
和center
等,各属性值见名知意,且可以通过|
组合使用。
在《第一行代码》中是这样描述它们的区别的
android:gravity用于指定文字在控件中的对齐方式,而android:gravity用于指定控件在布局中的对齐方式
我通过上机编码发现,上面的说法是有失偏驳的。
我觉得下面的描述才比较准确。
android:gravity:是对view控件本身来说的,是用来设置view本身的内容应该显示在view的什么位置,默认值是左侧。也可以用来设置布局中的控件位置
android:layout_gravity:是相对于包含改元素的父元素来说的,设置该元素在父元素的什么位置;比如TextView: android:layout_gravity表示TextView在界面上的位置,android:gravity表示TextView文本在TextView的什么位置,默认值是左侧
简而言之,gravity和layout_gravity的可以实现的效果是一样的,只不过gravity用在父元素中,用于控制子元素在父元素中的位置,而layout_gravity用在子元素中,也是控制子元素在父元素中的位置,可以推理,在EditText设置gravity,是控制EditText的子元素,也就是text的显示位置的。来看下面两份代码
代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<EditText
android:id = "@+id/et1"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello_world"/>
</LinearLayout>
</LinearLayout>
其显示效果如下
center=center_horizontal|center_vertical
但是为什么EditText只显示在屏幕水平中央,而没有在垂直中央呢?
这是因为父布局LinearLayout的方向是vertical,它是垂直扩展的,所以它的高度是不确定的,高度的一半在哪也是不知道的,所以设置垂直居中是失效(其实完整来说是设置垂直方向的layout_gravity属性会失效,其他比如bottom等也会失效)。
类似地,如果把父布局方向设置为horizontal,EditText就会显示在垂直中央而不是水平中央。
再来看下一份代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:gravity="center"
android:layout_height="match_parent">
<EditText
android:id = "@+id/et1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello_world"/>
</LinearLayout>
</LinearLayout>
仅有两行不同,其显示效果如下:
这就是真正的水平和垂直居中了,所以这就是它们的效果差异吧,理论上它们可以达到的显示效果应该是一样的,只不过由于某些原因layout_gravity的某些设置实现会失效。
相对布局RelativeLayout
我觉得相对布局挺简单的,注意一点:相对布局不像线性布局那样会从左往右或者从上往下排列,如果你不设置位置的话,它会一直从屏幕左上方开始,而无论叠了多少层。
至于属性设置,都是见名知意,不赘述了。