- Android 5從入門到精通
- 李波
- 1539字
- 2021-03-19 15:29:02
4.2 使用XML定義視圖
在使用XML構(gòu)建一個(gè)用戶界面之前我們需要重溫一下Android工程的目錄結(jié)構(gòu)。如圖4.2所示,以HelloAndroid為例,res目錄為Android工程中所使用的資源目錄,用戶UI所涉及的資源基本都放置在該目錄下。res目錄下的每一項(xiàng)資源文件都會(huì)由aapt(Android Asset Packaging Tool)為其生成一個(gè)對應(yīng)的public static final類型的ID號,放置到gen目錄下的R.java文件中,Android系統(tǒng)根據(jù)該ID號來訪問對應(yīng)資源。gen目錄由ADT根據(jù)資源文件自動(dòng)生成,不需要用戶修改,由系統(tǒng)維護(hù)。res/drawable/目錄用來存放工程中使用到的圖片文件,drawable之后的hdpi、ldpi、mdpi分別放高分辨率、低分辨率和中分辨率的圖片以適應(yīng)不同分辨率的手機(jī)。Android系統(tǒng)會(huì)根據(jù)用戶手機(jī)的配置信息自動(dòng)選取合適分辨率的圖片文件,無須程序員干預(yù)。res/layout/目錄下存放著定義UI布局文件用的xml文件,默認(rèn)文件名為main.xml;res/values/目錄下存放著用于存儲(chǔ)工程中所使用到的一些字符串信息的文件,默認(rèn)文件名為strings.xml。當(dāng)然,每個(gè)目錄下都可以存放多個(gè)xml文件,可由開發(fā)者自行創(chuàng)建。由此可見,Android工程中使用的用戶UI設(shè)計(jì),以及用戶UI中涉及的字符串都是由xml文件來存儲(chǔ)的。Android系統(tǒng)使用xml文件來定義用戶視圖。

圖4.2 Android工程的目錄結(jié)構(gòu)
單擊打開values文件夾下的string.xml文件顯示出如下代碼:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello Android!</string> <string name="app_name">HelloAndroid</string> </resources>
文件的開頭部分<?xml version="1.0" encoding="utf-8"?>定義了xml的版本號和字符編碼,這個(gè)部分在所有的xml文件中都會(huì)有,由系統(tǒng)自動(dòng)添加,不需要修改。<resources>標(biāo)簽定義了hello和app_name兩個(gè)變量,可以被HelloAndroid工程直接使用。當(dāng)該文件被修改,gen目錄下的R.java文件也會(huì)跟隨進(jìn)行更新。
雙擊main.xml文件,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@id/textView1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
<LinearLayout>標(biāo)簽定義了當(dāng)前視圖使用的是LinearLayout布局,也叫做線性布局方式,這種也是最常用的布局方式,Android SDK還提供其他的幾種布局方式,我們會(huì)在后面的章節(jié)中進(jìn)行詳細(xì)的介紹。在<LinearLayout>標(biāo)簽中定義了該布局方式的相關(guān)屬性。android:layout_width="fill_parent"和android:layout_height="fill_parent"表示該布局的寬和高充滿整個(gè)手機(jī)屏幕,android:orientation="vertical"表示該布局中所放入的組件的排列方式為縱向排列。
在<LinearLayout ...>和</LinearLayout>之間就可以添加各種UI組件并設(shè)置組件的相關(guān)屬性,例如組件的高度、寬度、組件的內(nèi)容等,在本章第四節(jié)會(huì)詳細(xì)介紹各種常見組件的使用方法。在HelloAndroid實(shí)例中添加的是一個(gè)TextView組件,相當(dāng)于一個(gè)顯示內(nèi)容的標(biāo)簽。android:layout_width="fill_parent"指定其寬度覆蓋滿容器的寬,android:layout_height="wrap_content"指定其高度跟隨其顯示內(nèi)容變化。android:id="@id/textView1"指明該TextView的ID值為R.java文件中id類的成員常量textView1。Android SDK提供了@[<package_ name>:]<resource_type>/<resource_name>方式以便于從xml文件中訪問工程的資源。android:text="@string/hello"指明該TextView組件顯示的內(nèi)容為資源文件string.xml中定義的hello變量的內(nèi)容。android:text屬性也可以直接指定要顯示的字符串,但是在實(shí)際的工程開發(fā)過程中不鼓勵(lì)這種方式,而應(yīng)該使用資源文件中的變量,因?yàn)檫@樣便于工程維護(hù)和國際化。在本書中,為了節(jié)省篇幅,部分顯示內(nèi)容簡單的組件使用了字符串直接賦值的方法。
Android工程中使用到的資源文件都會(huì)在gen目錄下的R.java中生成對應(yīng)項(xiàng),由系統(tǒng)為每個(gè)資源分配一個(gè)十六進(jìn)制的整型數(shù)值,唯一標(biāo)明每個(gè)資源。
HelloAndroid工程中的R.java文件代碼如下:
package introduction.android.helloAndroid; public final class R { public static final class attr { } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class id { public static final int textView1=0x7f050000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }
由該文件可見,R為靜態(tài)最終類。其中public static final class layout代表的是res/layout文件夾的內(nèi)容,layout類的每個(gè)整型常量代表該文件夾下的一個(gè)xml布局文件。例如,public static final int main代表的是main.xml文件,0x7f030000為系統(tǒng)main.xml文件生成的整型數(shù)值。在Android工程中根據(jù)該數(shù)值找到main.xml文件。public static final class string代表的是res/values/strings.xml文件,string類中的每個(gè)整型常量型成員代表strings.xml文件中定義的一個(gè)變量。例如,public static final int app_name代表strings.xml中定義的app_name變量,public static final int hello代表stings.xml文件中定義的hello變量。
在工程開發(fā)過程中,可以通過[<package_name>.]R.<resource_type>.<resource_name>方式來訪問R中定義的任意資源。其中package_name為資源文件被放置的包路徑,一般可以省略。resource_type為資源類型,例如layout,string,color,drawable,menu等。resource_name指的是為資源文件在類中定義的整型常量的名字。例如:
setContentView(R.layout.main);
這行代碼中,通過R.layout.main找到了布局文件main.xml,并通過setContentView方法將其設(shè)置為當(dāng)前Activity的視圖。要從視圖中查找某個(gè)組件,需要使用findViewById方法,通過組件ID獲取到組件的對象。例如要獲取到main.xml中的TextView組件對象,需要執(zhí)行以下代碼:
TextView textview=(TextView)findViewById(R.id.textView1);
- 數(shù)據(jù)科學(xué)實(shí)戰(zhàn)手冊(R+Python)
- Python數(shù)據(jù)分析入門與實(shí)戰(zhàn)
- Visual FoxPro程序設(shè)計(jì)教程
- Vue.js 3.x從入門到精通(視頻教學(xué)版)
- 秒懂設(shè)計(jì)模式
- 鋒利的SQL(第2版)
- Web Development with MongoDB and Node(Third Edition)
- BeagleBone Black Cookbook
- 基于ARM Cortex-M4F內(nèi)核的MSP432 MCU開發(fā)實(shí)踐
- Developing SSRS Reports for Dynamics AX
- Xamarin Blueprints
- 百萬在線:大型游戲服務(wù)端開發(fā)
- Internet of Things with Arduino Cookbook
- 測試基地實(shí)訓(xùn)指導(dǎo)
- 深入解析Java虛擬機(jī)HotSpot