1、Android应用中的绝大部分的UI组件都位于 android.widget包及其子包 、android.view包 java
及其子包中,全部的UI组件都继承了View类,这个View类是一个实际的类,不是抽象类或者接 android
口,View还有一个很是重要的子类——ViewGroup , ViewGroup是一个抽象类,全部的布局 布局
管理器,如:LinearLayout类都是它的子类,这些类都是实际的类,通常ViewGroup的子类是 xml
当作容器来使用的,并且因为ViewGroup自己就是View的子类,因此在这些容器中还可以添加 继承
ViewGroup容器,这样一来就可以构建UI系统了 ;也就说View和ViewGroup构成了Android get
中的所有UI界面string
2、咱们知道因为在Android中提倡使用XML来布局UI组件,那么全部的组件天然就会有XML属性容器
有这些属性来控制UI组件的属性,固然这些属性大多也有java方法与之对应,以便使用java代码 方法
来控制组件layout
3、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时将这些内部机制给隐藏起来了
4、按照上面的说法既然组件自己已经有了有了想android:width属性了,为何还要使用静态内
部类指定的android:layout_width这个布局属性(注意这叫作布局属性,即布局高度、布局
宽度),由于Android中规定一个组件的大小是由布局和实际大小共同决定的,至于决定方式
见《疯狂android》P44