Android 查漏补缺之布局篇

想想自己学习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_horizontalcenter等,各属性值见名知意,且可以通过|组合使用。

在《第一行代码》中是这样描述它们的区别的

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

我觉得相对布局挺简单的,注意一点:相对布局不像线性布局那样会从左往右或者从上往下排列,如果你不设置位置的话,它会一直从屏幕左上方开始,而无论叠了多少层。

至于属性设置,都是见名知意,不赘述了。

发布了84 篇原创文章 · 获赞 250 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/ygdxt/article/details/85218834