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

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);
主站蜘蛛池模板: 建瓯市| 东丰县| 齐河县| 雷山县| 自治县| 卢氏县| 泰宁县| 宁阳县| 宿州市| 衡南县| 安吉县| 闻喜县| 吉林市| 大埔区| 乐至县| 墨脱县| 连云港市| 土默特右旗| 阜康市| 磐安县| 莱芜市| 兴山县| 金堂县| 江北区| 湄潭县| 五原县| 汉阴县| 华宁县| 河南省| 景谷| 武定县| 田阳县| 余干县| 石家庄市| 泽普县| 什邡市| 新乡县| 化州市| 桓台县| 罗源县| 石林|