- 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è)對(duì)應(yīng)的public static final類型的ID號(hào),放置到gen目錄下的R.java文件中,Android系統(tǒng)根據(jù)該ID號(hào)來(lái)訪問對(duì)應(yīng)資源。gen目錄由ADT根據(jù)資源文件自動(dòng)生成,不需要用戶修改,由系統(tǒng)維護(hù)。res/drawable/目錄用來(lái)存放工程中使用到的圖片文件,drawable之后的hdpi、ldpi、mdpi分別放高分辨率、低分辨率和中分辨率的圖片以適應(yīng)不同分辨率的手機(jī)。Android系統(tǒng)會(huì)根據(jù)用戶手機(jī)的配置信息自動(dòng)選取合適分辨率的圖片文件,無(wú)須程序員干預(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文件來(lái)存儲(chǔ)的。Android系統(tǒng)使用xml文件來(lái)定義用戶視圖。

圖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的版本號(hào)和字符編碼,這個(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ù)和國(guó)際化。在本書中,為了節(jié)省篇幅,部分顯示內(nèi)容簡(jiǎn)單的組件使用了字符串直接賦值的方法。
Android工程中使用到的資源文件都會(huì)在gen目錄下的R.java中生成對(duì)應(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>方式來(lái)訪問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獲取到組件的對(duì)象。例如要獲取到main.xml中的TextView組件對(duì)象,需要執(zhí)行以下代碼:
TextView textview=(TextView)findViewById(R.id.textView1);
- 少兒人工智能趣味入門:Scratch 3.0動(dòng)畫與游戲編程
- 演進(jìn)式架構(gòu)(原書第2版)
- 深入理解Android(卷I)
- ASP.NET Web API:Build RESTful web applications and services on the .NET framework
- 案例式C語(yǔ)言程序設(shè)計(jì)
- 編程的修煉
- Mastering Ember.js
- React.js Essentials
- Visual C++串口通信技術(shù)詳解(第2版)
- TradeStation交易應(yīng)用實(shí)踐:量化方法構(gòu)建贏家策略(原書第2版)
- Hands-On Swift 5 Microservices Development
- Symfony2 Essentials
- 微信小程序全棧開發(fā)技術(shù)與實(shí)戰(zhàn)(微課版)
- MySQL程序員面試筆試寶典
- 零基礎(chǔ)學(xué)HTML+CSS