一、布局的结构
布局是由View对象和ViewGroup的层次结构共同组成的。如下图所示。
- View对象用来定义用户可以查看并进行交互的内容,如按钮Button,文本框TextView等都属于View对象。
- ViewGroup对象是一个不可见的容器,其可以包括View对象以及ViewGroup对象,是用来将View对象以及ViewGroup对象组织成一个结构的。其子类有LinearLayout或者ConstraintLayout对象。
- 每个布局文件都只能有一个根元素,并且该元素只能是View对象或者ViewGroup对象。此外,根元素确定后,可以添加子元素(View对象或者ViewGroup对象)。
举例:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/wang"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="wang fangjia"
/>
</LinearLayout>
二、布局的属性
View对象和ViewGroup的所有xml属性可以分为三类,一是View对象的特有属性,例如TextView对象的textSize属性;二是所有View对象的共有属性,例如id属性;三是布局参数属性,即用于描述布局方向的属性。
1、id属性
xml文件中,id属性是以字符串形式表现的,经过编译后,系统将会以整型形式引用该id。id属性的写法有两种。首先android框架自身提供了许多id资源,当引用android资源,就需要添加android软件包命名空间,如:
android:id="@android:id/empty"
其次,若需要创建新的布局资源,那么就需要自己创建id资源。此时,@符号需要加号(+)来表示这是一个新的资源名称,需要创建该名称,然后添加到我们的资源R.java文件中(不需要andriod命名空间了)。实际上@+id就是在R.java文件中新增一个id名称,如果之前存在了相同的名称,就会覆盖掉。而@id就是直接引用R.java文件已存在的id资源。
android:id="@+id/wang" //这里的wang就是我们自己取得名字
其中,@符号表示xml解析器应该继续解析后续ID字符串的其余部分。
- 注意:
id属性的字符串名称,在同一布局中必须是统一的,不能重名,但是在不同布局中可以同名。
2、布局参数
布局参数用于设定视图的自身大小(长和宽)以及与周围的距离(左边距和上边距)。
<TextView
android:layout_width="100dp" //宽
android:layout_height="200dp" //高
android:layout_marginLeft="10dp" //左边距
android:layout_marginTop="10dp" //上边距
android:text="Hello World!" />
建议不要使用绝对单位(px像素单位)来指定布局的宽度和高度,而是采用相对单位,如与密度无关的像素单位(dp)、wrap_content或者match_parent。这样可以助于应用在不同尺寸的屏幕上都能够正确显示。
- wrap_content:自动将视图调整为内容所需要的尺寸。
- match_parent:将视图尽可能采用父类视图所允许的最大尺寸。
px像素与dp像素区别:
- px像素指的是屏幕上一个物理的像素点,50px像素在不同分辨率下,布局视图的尺寸是不一样的。
- dp像素是与设备无关的像素,它与像素密度(每英寸包含的像素数目)相关。
三、加载布局资源
当定义好布局结构后,若想android平台获取该布局结构,有两种方法。
- 通过java代码,在运行时实例化布局元素,如下:
ConstraintLayout constraintLayout = new ConstraintLayout(this);
TextView view = new TextView(this);
view.setText("Hello World!");
constraintLayout.addView(view);
- 将该布局结构是写在xml文件中的。编译过程中,系统将会把每一个xml文件编译成view资源,放置在项目的res/layout目录下。并且在Activity.onCreate()回调方法中,通过setContentView()方法,以R.layout.xml文件名作为参数调用该布局资源。如:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.wang);
}
}