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