Android UI 概览
一、Android应用中的绝大部分的UI组件都位于 android.widget包及其子包 、android.view包
及其子包中,所有的UI组件都继承了View类,这个View类是一个实际的类,不是抽象类或者接
口,View还有一个非常重要的子类——ViewGroup , ViewGroup是一个抽象类,所有的布局
管理器,如:LinearLayout类都是它的子类,这些类都是实际的类,一般ViewGroup的子类是
当做容器来使用的,而且由于ViewGroup本身就是View的子类,所以在这些容器中还能够添加
ViewGroup容器,这样一来就能够构建UI系统了 ;也就说View和ViewGroup构成了Android
中的全部UI界面
二、我们知道由于在Android中提倡使用XML来布局UI组件,那么所有的组件自然就会有XML属性
有这些属性来控制UI组件的属性,当然这些属性大多也有java方法与之对应,以便使用java代码
来控制组件
三、ViewGroup抽象类中含有两个静态内部类:
ViewGroup.LayoutParams 、 ViewGroup.MarginLayoutParams
(注:实际上后者是前者的子类)
当我们向ViewGroup的子类容器中添加组件时,需要使用这两个内部类来指定,到底以何种方
式添加,比如:组件的布局大小,组件的位置等属性
注意在ViewGroup的所有子类中,都含有继承自ViewGroup.LayoutParams 或者
ViewGroup.MarginLayoutParams的静态内部类,这些静态内部类的名字都叫做
类名.LayoutParams ,如:LinearLayout.LayoutParams ; 这样一来不管指定组件
添加到何种ViewGroup容器中,都可以使用对应的静态内部类的XML属性来指定添加方式,
这些静态内部类中都有对应的XML属性,比如:android:layout_height、
android:layout_width属性,使用方法如:
<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" >
<TextView android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
也就是说在组件的属性定义区中直接使用android:layout_width属性就行了 ; 你可能会有费解
“这些静态内部类的XML属性并不是这些组件的XML属性,为什么能够直接在组件中使用,而不用声
明一下:我使用的属性,是静态内部类中指定的属性 呢?”,实际上已经指定了我们使用的属性是
静态内部类指定的属性,android:layout_width中的 layout 关键字就是设个说明,我们可能注意
到,组件的属性中已经有android:width这样的属性了,所以说android:layout_width和
android:width的不同,就体现出来了; 所以以后在看到带有layout或者layout_margin(如:
android:layout_marginTop)的XML属性,就应知道这是
使用的是静态内部类中的属性,而不带有layout的属性的XML属性,则是组件本身带有的属性;
实际上我们可以查看:《疯狂Android》P45中代码,就会发现当我们使用java代码来指定Button组
件的属性时,如果使用LinearLayout的静态内部类的属性时,使用方式什么样的;这就是内部机制,
只是使用XML时将这些内部机制给隐藏起来了
四、按照上面的说法既然组件本身已经有了有了想android:width属性了,为什么还要使用静态内
部类指定的android:layout_width这个布局属性(注意这叫做布局属性,即布局高度、布局
宽度),因为Android中规定一个组件的大小是由布局和实际大小共同决定的,至于决定方式
见《疯狂android》P44

浙公网安备 33010602011771号