Android XML布局詳解
2014-01-02 15:55:34|??分類:android|??標(biāo)簽:androidxml布局詳解|舉報(bào)|字號訂閱
Android XML布局詳解 - XML Layouts
XML布局作為用戶界面直接作用顯示在Activity(活動(dòng)五督、界面)上铅歼。它定義了布局結(jié)構(gòu)换薄,并把所有在布局里的元素顯示給用戶,可以在兩個(gè)方面聲明你的布局:
直接在XML文件里聲明你的UI元素:Android提供一個(gè)簡單的XML文件來對應(yīng)界面要顯示的View和它的子類跨算,比如一些工具控件按鈕、圖片和一些布局等椭懊。
在代碼里動(dòng)態(tài)的實(shí)例化布局元素:在運(yùn)行的代碼里你可以創(chuàng)建視圖View和View Group诸蚕,也可以給它們制定對應(yīng)的屬性,不如高度寬度等。
Android框架提供了這兩種定義布局的方式氧猬,你可以非常靈活的運(yùn)用它們背犯。比如,你可以在xml文件里聲明你的界面元素盅抚,你也可以在代碼里修改這些界面元素媳板。
在你的應(yīng)用程序里用XML文件定義布局你可以更好的將對UI元素的控制和你的邏輯代碼分離。你的UI描述在你的程序之外泉哈,這就意味著你可以獨(dú)立的修改重新適配這些界面元素而不必重新編譯和修改你的代碼蛉幸。例如:你可以創(chuàng)建不同屏幕大小破讨、方向、語言的XML布局文件奕纫,此外提陶,在XML文件里聲明布局讓你的UI更加可視化、形象化匹层,更容易控制調(diào)試界面問題隙笆。當(dāng)然這個(gè)文檔的重點(diǎn)是教你如何在XML文件里定義布局界面。如果你對在代碼中定義View對象有興趣的話升筏,你可以參考ViewGroup和View類撑柔。
通常情況下,在XML文件中聲明UI元素的詞匯和命名類您访、構(gòu)造方法的名字緊密相關(guān)铅忿。其中元素的名字對應(yīng)類的名字,屬性的名字對應(yīng)方法的名字灵汪。在實(shí)際中這種對應(yīng)關(guān)系非常直接檀训,甚至你可以直接猜到在XML屬性對應(yīng)類的那個(gè)方法,哪個(gè)類對應(yīng)XML中的元素享言。也有一些輕微的差異峻凫,比如EditText元素有一個(gè)text屬性,對應(yīng)的是EditText.setText()方法览露。
寫XML布局文件 -Write the XML
android提供一系列的嵌套元素荧琼,你可以用像創(chuàng)建html文件的方式來使用這些元素,用Android的XML元素差牛,你可以非趁螅快的設(shè)計(jì)你的UI布局和它們所包含的屏幕元素。
每個(gè)布局文件必須包含一個(gè)根元素多糠,它必須是一個(gè)View或ViewGroup對象累舷。如果你定義的根元素,你可以在它內(nèi)部添加其他的布局對象或者部件來作為它的子元素夹孔,逐步建立一個(gè)視圖層次結(jié)構(gòu)定義到你的根布局中被盈。例如,這里是一個(gè)XML布局搭伤,使用一個(gè)垂直的LinearLayout其中包含一個(gè)TextView和一個(gè)Button:
為了使你的布局文件能夠正確的被編譯只怎,除了你需要在XML文件里正確的定義你的布局之外,你還需要以.xml的后綴名來保存該文件怜俐,并把它放到android工程的res/layout目錄
加載XMl布局 -Load the XML Resource
當(dāng)您編譯您的應(yīng)用程序身堡,每個(gè)XML布局文件被編譯成一個(gè)視圖資源。您應(yīng)該從您的應(yīng)用程序代碼加載布局資源拍鲤,在您的Activity.onCreate()回調(diào)方法中實(shí)現(xiàn)贴谎。通過調(diào)用setContentView()汞扎,傳遞給它的參考布局資源的形式:例如如果你XML布局作為main_layout.xml保存的,加載它擅这,像這樣:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
在你的程序運(yùn)行是澈魄,onCreate方法會(huì)被回調(diào),詳細(xì)你可以看一下Activity的生命周期仲翎。
屬性-Attributes
每個(gè)View和ViewGroup對象都有對應(yīng)的屬性痹扇。有些屬性只支持自己的View對象(例如,TextView的的TEXTSIZE屬性只是TextView可以使用)溯香,有些屬性是共有的鲫构,比如id屬性,因?yàn)樗鼈兪菑母鵙iew類繼承的玫坛。還比如有些屬性被認(rèn)為是“布局參數(shù)”结笨,就是描述View對象的某些布局方向,由該對象的父ViewGroup對象定義的屬性也是公用的昂秃。
ID
在View的視圖樹里禀梳,每一個(gè)View視圖都有一個(gè)整數(shù)的唯一標(biāo)識ID和它相關(guān)聯(lián)杜窄。就是說肠骆,每一個(gè)View都有一個(gè)唯一的標(biāo)識ID。這個(gè)ID的引用是一個(gè)整數(shù)塞耕。在XML文件里這個(gè)ID通常被制定成字符串蚀腿,這個(gè)ID屬性被View的所有視圖所共有,就是說在所有的控件里都有這個(gè)屬性扫外,你會(huì)經(jīng)常的使用它莉钙,在XML文件里id標(biāo)簽的語法是:
android:id="@+id/my_button"
在字符串開頭的@符號表示,XML解析器應(yīng)該把后邊的字符串作為一個(gè)ID來解析和擴(kuò)展筛谚。+號表示磁玉,這是一個(gè)新的ID并且需要把這個(gè)ID的引用放到資源R.java文件里。也有一些資源是android框架提供的驾讲,當(dāng)你需要引用android框架提供的資源時(shí)蚊伞,你并不需要添加其他的符號,但你必須你提供android包的命名空間例如:
android:id="@android:id/empty"
在Android包命名空間的地方吮铭,我們現(xiàn)在引用從android.R資源類的ID时迫,而不是當(dāng)?shù)氐馁Y源類。既再導(dǎo)入包的時(shí)候我們需要導(dǎo)入android.R資源的ID谓晌。創(chuàng)建Views并在程序中引用它們掠拳,常用的模式是:
1、定義一個(gè)視圖或者控件纸肉,并給它一個(gè)唯一的標(biāo)識ID
2溺欧、創(chuàng)建一個(gè)View實(shí)例對象喊熟,并從布局文件中獲得它(一般在onCreate方法里獲得).
Button myButton = (Button) findViewById(R.id.my_button);
在一個(gè)RelativeLayout布局里,指定View的ID是非常重要的胧奔。因?yàn)樵赗elativeLayout布局中逊移,同級的View可以相對另一個(gè)同級的View的位置定義,這就需要另一個(gè)view提供唯一的表示ID龙填。一個(gè)ID在整個(gè)項(xiàng)目中可能定義的不是唯一的胳泉,但是必須保證在一個(gè)xml文件里定義是唯一的,最好的就是在整個(gè)項(xiàng)目中定義的ID是唯一的岩遗。
布局參數(shù)
XML布局屬性layout_something被定義為布局參數(shù)扇商,它們被View和ViewGroup所恰當(dāng)?shù)谋A簟C縑iewGroup的類實(shí)現(xiàn)一個(gè)嵌套類擴(kuò)展ViewGroup.LayoutParams的宿礁。這個(gè)子類包含的屬性類型定義為每個(gè)子視圖的大小和位置案铺,作適當(dāng)?shù)囊晥D組。正如你可以看到下圖中梆靖,父視圖組定義為每個(gè)子視圖(包括子視圖組)的布局參數(shù)控汉。
http://developer.android.com/images/layoutparams.png
圖片介紹:可視化的視圖層次的每個(gè)視圖的布局參數(shù)
請注意,每一個(gè)的LayoutParams子類有它自己的語法設(shè)定值返吻。每個(gè)子元素必須定義相對它父類合適的LayoutParams姑子,盡管它也可以為自己的子類定義不同的LayoutParams。
所有的視圖組包括一個(gè)寬度和高度(layout_width和layout_height)测僵,每個(gè)視圖需要定義它們街佑。許多的LayoutParams也包括可選的邊距和邊框。您可以指定寬度和高度精確的值捍靠。大部分您將使用這些常量類設(shè)置寬度或高度:wrap_content其內(nèi)容所需的尺寸大小本身沐旨。fill_parent(API等級8改名為match_parent,與它的父視圖組一樣大榨婆。在一般情況下磁携,不建議指定一個(gè)布局使用絕對單位,如像素的寬度和高度良风。相反谊迄,推薦采用相對測量,如獨(dú)立的像素密度單位(DP)拖吼,wrap_content鳞上,或fill_parent,因?yàn)樗兄诖_保您的應(yīng)用程序?qū)⒃诟鞣N設(shè)備的屏幕尺寸顯示正確吊档。
布局位置
一個(gè)View的幾何形狀是一個(gè)矩形篙议。每一個(gè)view的位置都可以用一個(gè)坐標(biāo)和兩個(gè)尺寸所表示,一個(gè)坐標(biāo)指的是相對最左邊和相對最頂部的兩個(gè)點(diǎn),兩個(gè)尺寸是指它的高度和寬度鬼贱。位置和尺寸的單位都是像素移怯。可以調(diào)用視圖的方法來獲得它的位置这难, getLeft() 返回左側(cè)的或者X的坐標(biāo)舟误,getTop()返回頂部或者Y的坐標(biāo)。這兩個(gè)方法返回的位置都是相對于它的父容器的位置姻乓。例如當(dāng)getLeft()返回20的時(shí)候嵌溢,說明這個(gè)view相對于它的父容器的最左邊邊緣20像素的位置。此外還提供了getRight(),getBottom()方法來滿足一些其他的計(jì)算蹋岩,調(diào)用getRight()時(shí)類似與getLeft()的計(jì)算赖草。
大小、填充剪个、邊距
view的大小即view的寬度和高度的大小秧骑,一個(gè)view其實(shí)擁有兩對值的大小。第一對稱為衡量高度和衡量寬度扣囊,定義的值的要在其父容器內(nèi)乎折,可以通過調(diào)用getMeasuredWidth()和getMeasuredHeight()得到它的值。第二對簡單地稱為寬度和高度或有時(shí)繪制的寬度和繪制的高度侵歇,這些值的定義要以實(shí)際屏幕的大小來看骂澄,寬度和高度可以通
過調(diào)用getWidth()和getHeight()獲得。填充表示像素的左盒至,前酗洒,右下方的視野士修。舉一個(gè)例子讓你明白大小枷遂、填充、邊距的關(guān)系的區(qū)別棋嘲。場景 畫室里展覽的多幅字畫酒唉。這些字畫就想我們程序里的view,每一個(gè)字畫都有它的長度和寬度沸移,既自己本身的大小痪伦,字畫都有木頭的裝潢,字畫本身距離這個(gè)裝潢的距離雹锣,既padding填充网沾,padding也有上下左右方向,你可以設(shè)置不同的值蕊爵,每一個(gè)字畫都距離另外的字畫有一定的距離辉哥,這個(gè)距離既邊距,既magin,magin也有自己的上下左右方向醋旦,你同樣可以制定其值恒水。
更多參考: