官术网_书友最值得收藏!

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);
主站蜘蛛池模板: 虞城县| 义乌市| 吉隆县| 双鸭山市| 西昌市| 汝阳县| 潍坊市| 顺平县| 大安市| 京山县| 吉安市| 广丰县| 遂宁市| 岗巴县| 博野县| 安宁市| 临夏县| 波密县| 桐柏县| 宁城县| 晋江市| 图们市| 阳春市| 昌黎县| 黄龙县| 凉山| 宝山区| 安陆市| 临汾市| 兴文县| 兰溪市| 四川省| 大余县| 永胜县| 兴和县| 齐河县| 洪泽县| 鄄城县| 东乡县| 馆陶县| 聂荣县|