Android XML布局詳解
2014-01-02 15:55:34|??分類:android|??標簽:androidxml布局詳解|舉報|字號訂閱
Android XML布局詳解 - XML Layouts
XML布局作為用戶界面直接作用顯示在Activity(活動、界面)上。它定義了布局結構,并把所有在布局里的元素顯示給用戶,可以在兩個方面聲明你的布局:
直接在XML文件里聲明你的UI元素:Android提供一個簡單的XML文件來對應界面要顯示的View和它的子類,比如一些工具控件按鈕、圖片和一些布局等。
在代碼里動態的實例化布局元素:在運行的代碼里你可以創建視圖View和View Group,也可以給它們制定對應的屬性,不如高度寬度等。
Android框架提供了這兩種定義布局的方式,你可以非常靈活的運用它們。比如,你可以在xml文件里聲明你的界面元素,你也可以在代碼里修改這些界面元素。
在你的應用程序里用XML文件定義布局你可以更好的將對UI元素的控制和你的邏輯代碼分離。你的UI描述在你的程序之外,這就意味著你可以獨立的修改重新適配這些界面元素而不必重新編譯和修改你的代碼。例如:你可以創建不同屏幕大小、方向、語言的XML布局文件,此外,在XML文件里聲明布局讓你的UI更加可視化、形象化,更容易控制調試界面問題。當然這個文檔的重點是教你如何在XML文件里定義布局界面。如果你對在代碼中定義View對象有興趣的話,你可以參考ViewGroup和View類。
通常情況下,在XML文件中聲明UI元素的詞匯和命名類、構造方法的名字緊密相關。其中元素的名字對應類的名字,屬性的名字對應方法的名字。在實際中這種對應關系非常直接,甚至你可以直接猜到在XML屬性對應類的那個方法,哪個類對應XML中的元素。也有一些輕微的差異,比如EditText元素有一個text屬性,對應的是EditText.setText()方法。
寫XML布局文件 -Write the XML
android提供一系列的嵌套元素,你可以用像創建html文件的方式來使用這些元素,用Android的XML元素,你可以非??斓脑O計你的UI布局和它們所包含的屏幕元素。
每個布局文件必須包含一個根元素,它必須是一個View或ViewGroup對象。如果你定義的根元素,你可以在它內部添加其他的布局對象或者部件來作為它的子元素,逐步建立一個視圖層次結構定義到你的根布局中。例如,這里是一個XML布局,使用一個垂直的LinearLayout其中包含一個TextView和一個Button:
為了使你的布局文件能夠正確的被編譯,除了你需要在XML文件里正確的定義你的布局之外,你還需要以.xml的后綴名來保存該文件,并把它放到android工程的res/layout目錄
加載XMl布局 -Load the XML Resource
當您編譯您的應用程序,每個XML布局文件被編譯成一個視圖資源。您應該從您的應用程序代碼加載布局資源,在您的Activity.onCreate()回調方法中實現。通過調用setContentView(),傳遞給它的參考布局資源的形式:例如如果你XML布局作為main_layout.xml保存的,加載它,像這樣:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
在你的程序運行是,onCreate方法會被回調,詳細你可以看一下Activity的生命周期。
屬性-Attributes
每個View和ViewGroup對象都有對應的屬性。有些屬性只支持自己的View對象(例如,TextView的的TEXTSIZE屬性只是TextView可以使用),有些屬性是共有的,比如id屬性,因為它們是從根View類繼承的。還比如有些屬性被認為是“布局參數”,就是描述View對象的某些布局方向,由該對象的父ViewGroup對象定義的屬性也是公用的。
ID
在View的視圖樹里,每一個View視圖都有一個整數的唯一標識ID和它相關聯。就是說,每一個View都有一個唯一的標識ID。這個ID的引用是一個整數。在XML文件里這個ID通常被制定成字符串,這個ID屬性被View的所有視圖所共有,就是說在所有的控件里都有這個屬性,你會經常的使用它,在XML文件里id標簽的語法是:
android:id="@+id/my_button"
在字符串開頭的@符號表示,XML解析器應該把后邊的字符串作為一個ID來解析和擴展。+號表示,這是一個新的ID并且需要把這個ID的引用放到資源R.java文件里。也有一些資源是android框架提供的,當你需要引用android框架提供的資源時,你并不需要添加其他的符號,但你必須你提供android包的命名空間例如:
android:id="@android:id/empty"
在Android包命名空間的地方,我們現在引用從android.R資源類的ID,而不是當地的資源類。既再導入包的時候我們需要導入android.R資源的ID。創建Views并在程序中引用它們,常用的模式是:
1、定義一個視圖或者控件,并給它一個唯一的標識ID
2、創建一個View實例對象,并從布局文件中獲得它(一般在onCreate方法里獲得).
Button myButton = (Button) findViewById(R.id.my_button);
在一個RelativeLayout布局里,指定View的ID是非常重要的。因為在RelativeLayout布局中,同級的View可以相對另一個同級的View的位置定義,這就需要另一個view提供唯一的表示ID。一個ID在整個項目中可能定義的不是唯一的,但是必須保證在一個xml文件里定義是唯一的,最好的就是在整個項目中定義的ID是唯一的。
布局參數
XML布局屬性layout_something被定義為布局參數,它們被View和ViewGroup所恰當的保留。每ViewGroup的類實現一個嵌套類擴展ViewGroup.LayoutParams的。這個子類包含的屬性類型定義為每個子視圖的大小和位置,作適當的視圖組。正如你可以看到下圖中,父視圖組定義為每個子視圖(包括子視圖組)的布局參數。
http://developer.android.com/images/layoutparams.png
圖片介紹:可視化的視圖層次的每個視圖的布局參數
請注意,每一個的LayoutParams子類有它自己的語法設定值。每個子元素必須定義相對它父類合適的LayoutParams,盡管它也可以為自己的子類定義不同的LayoutParams。
所有的視圖組包括一個寬度和高度(layout_width和layout_height),每個視圖需要定義它們。許多的LayoutParams也包括可選的邊距和邊框。您可以指定寬度和高度精確的值。大部分您將使用這些常量類設置寬度或高度:wrap_content其內容所需的尺寸大小本身。fill_parent(API等級8改名為match_parent,與它的父視圖組一樣大。在一般情況下,不建議指定一個布局使用絕對單位,如像素的寬度和高度。相反,推薦采用相對測量,如獨立的像素密度單位(DP),wrap_content,或fill_parent,因為它有助于確保您的應用程序將在各種設備的屏幕尺寸顯示正確。
布局位置
一個View的幾何形狀是一個矩形。每一個view的位置都可以用一個坐標和兩個尺寸所表示,一個坐標指的是相對最左邊和相對最頂部的兩個點,兩個尺寸是指它的高度和寬度。位置和尺寸的單位都是像素??梢哉{用視圖的方法來獲得它的位置, getLeft() 返回左側的或者X的坐標,getTop()返回頂部或者Y的坐標。這兩個方法返回的位置都是相對于它的父容器的位置。例如當getLeft()返回20的時候,說明這個view相對于它的父容器的最左邊邊緣20像素的位置。此外還提供了getRight(),getBottom()方法來滿足一些其他的計算,調用getRight()時類似與getLeft()的計算。
大小、填充、邊距
view的大小即view的寬度和高度的大小,一個view其實擁有兩對值的大小。第一對稱為衡量高度和衡量寬度,定義的值的要在其父容器內,可以通過調用getMeasuredWidth()和getMeasuredHeight()得到它的值。第二對簡單地稱為寬度和高度或有時繪制的寬度和繪制的高度,這些值的定義要以實際屏幕的大小來看,寬度和高度可以通
過調用getWidth()和getHeight()獲得。填充表示像素的左,前,右下方的視野。舉一個例子讓你明白大小、填充、邊距的關系的區別。場景 畫室里展覽的多幅字畫。這些字畫就想我們程序里的view,每一個字畫都有它的長度和寬度,既自己本身的大小,字畫都有木頭的裝潢,字畫本身距離這個裝潢的距離,既padding填充,padding也有上下左右方向,你可以設置不同的值,每一個字畫都距離另外的字畫有一定的距離,這個距離既邊距,既magin,magin也有自己的上下左右方向,你同樣可以制定其值。
更多參考: