第五章 用戶界面設(shè)計

2021-10-21 11:59 更新

第五章 用戶界面設(shè)計

在本篇教程中我們將為應(yīng)用程序項目添加布局方案,在這方面XML與Eclipse ADT接口將成為工作中的得力助手——不過在后面兩節(jié)中還會用到一部分Java開發(fā)知識。XML與Java在Android平臺的開發(fā)工作當(dāng)中可謂無處不在,如果大家對二者還缺乏基本的了解,請盡快想辦法補補課。對于剛剛?cè)腴T的讀者朋友來說,本文所介紹的要點將成為各位日后開發(fā)工作的重要基礎(chǔ)。

1. XML基礎(chǔ)知識

在我們開始討論布局之前,先來梳理作為標記語言的XML的基礎(chǔ)知識。如果大家對于XML已經(jīng)很熟悉,可以直接跳過本節(jié)。XML是一種用于保存數(shù)據(jù)值的語言。XML文件在多個領(lǐng)域發(fā)揮作用。它們在某些項目中的功能與數(shù)據(jù)庫非常相近,而且通常被作為網(wǎng)頁的輸出機制。如果大家之前曾經(jīng)使用過HTML,應(yīng)該 會對XML的基本功能感到熟悉。

在XML中,數(shù)據(jù)值被保存在元素當(dāng)中。單一元素通常包含一個開始標記與一個結(jié)束標記,如下所示:

<product>Onion</product> 

如大家所見,開始標記與結(jié)束標記幾乎完全一樣,惟一的區(qū)別在于結(jié)束標記中多了一個“/”符號。在上面的例子中,數(shù)據(jù)值也就是元素內(nèi)容,即文本字符串“Onion”。開始標記也可以容納與數(shù)據(jù)項目相信的其它屬性信息,如下所示:

<product type="vegetable">Onion</product> 

每項屬性都有一個名稱與一個值,其中值就是引號內(nèi)的部分。元素中還可以包含其它元素:

<section name="food">
<product type="vegetable">Onion</product>
<product type="fruit">Banana</product>
</section>

在這種結(jié)構(gòu)中,我們將section元素稱為主元素、products元素則被稱為子元素。兩個子元素之間屬于“兄弟關(guān)系”。在XML文檔當(dāng)中,必 須存在一個root元素作為主元素,或者被稱為“嵌套”。這就構(gòu)成了一種tree結(jié)構(gòu),其中子元素作為自主元素延伸出去的分支。如果某個子元素之下還包含 其它子元素,那么它本身同時也具有主元素屬性。

大家還會遇到另一種自結(jié)束元素,其中開始與結(jié)束標記并非獨立存在:

<order number="12345" customerID="a4d45s"/> 

其中元素末尾的“/”符號代表結(jié)束。

我們在Android平臺上所使用的全部資源文件都要用到XML標記,其中包括布局文件、可繪制元素、數(shù)據(jù)值以及Manifest。

2. Android布局

第一步

當(dāng)大家在安裝了ADT的Eclipse IDE當(dāng)中使用XML時,輸入過程中顯示的相關(guān)背景提示能讓編碼過程變得更輕松一些。在編輯器中打開新應(yīng)用中的主布局文件,確保XML編輯標簽已經(jīng)被選 中,這樣我們就能直接對代碼進行編輯了。我們首先要處理的是用于主屏幕的布局方案,用戶在啟動應(yīng)用之后最先看到的就是它。Eclipse會提供一套基礎(chǔ)布局,供我們進行個性化修改:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

如大家所見,根元素是一項布局元素,在上面的示例中為RelativeLayout。Android當(dāng)中還提供其它幾種布局類型,我們可以將一種布局嵌套到另一種當(dāng)中。這里的根布局元素擁有幾項額外屬性且與布局效果密切相關(guān),例如寬度、高度以及邊距等等。布局元素當(dāng)中的TextView允許開發(fā)人員顯示一條文本字符串。TextView是View的一種,View屬于可見及交互性元素,用以構(gòu)成我們的應(yīng)用程序UI。因此,應(yīng)用程序中的每套分屏方案都要選擇一種View,并在其中包含一種或者多種布局機制。在Android系統(tǒng)中,這些布局被稱為ViewGroup對象,每個 ViewGroup內(nèi)包含一套或者多套View。

第二步

為了專注于一套布局的基礎(chǔ)創(chuàng)建工作,我們要把主布局文件中的現(xiàn)有內(nèi)容全部刪掉,這樣才能從零開始著手設(shè)計。正如我們之前所提到,大家可以利用 Java代碼創(chuàng)建自己的布局或者View,不過Android上的多種工具允許開發(fā)者利用XML設(shè)計自己的應(yīng)用UI——這樣各位就可以在創(chuàng)建元素的同時直接觀察設(shè)計效果了。在某些實例中,大家可能見過單純通過Java代碼創(chuàng)建一些或者全部UI的做法,但現(xiàn)實情況下大部分創(chuàng)建工作還是要由XML完成的。這種做法還能保證應(yīng)用程序邏輯與顯示元素彼此獨立。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- views go here -->

</LinearLayout>

LinearLayout會沿橫向或者縱向顯示我們打算使用的View。在以上示例中顯示方向為垂直,因此每個View都會沿屏幕下方依次排列。如 果采取橫向布局,那么各個View將由左至右依次排列。如果使用“l(fā)ayout width”與“l(fā)ayout height”兩種屬性(在Android當(dāng)中,它們往往被稱為布局參數(shù)),那么布局會被拉伸至橫向與縱向的最大長度。

在“l(fā)ayout height”聲明行之后再添加一條新行,通過鍵入“android:”準備開始輸入屬性。當(dāng)大家輸入對應(yīng)內(nèi)容,Eclipse就會提供一套與該屬性相關(guān) 的列表。大家可以繼續(xù)輸入內(nèi)容以縮小屬性列表,也可以直接在列表中用鼠標進行點選?,F(xiàn)在我們選擇“android:gravity”屬性。

5.1layout_attribute_prompt

鍵入“center_horizontal”作為gravity值,這樣其中包含的元素就會以X軸為中心加以顯示:

android:gravity="center_horizontal"

這種方式適用于布局中的一切元素。我們可以添加其它幾種額外顯示屬性,例如填充、邊距以及背景等。不過在今天的文章中,我們先從最簡單的項目入手。

3. 添加View

第一步

正面我們開始向布局中添加View。所謂View,是指UI當(dāng)中的可見元素。讓我們首先添加一些文本內(nèi)容和一個按鈕。進入LinearLayout元素(在開始忹結(jié)束標記之間),輸入“<”之后Eclipse就會提示大家與屬性相關(guān)的可用元素列表。

5.2layout_element_prompt

在列表中選擇TextView。請注意,與大部分View一樣,這是一種自結(jié)束元素。為TextView設(shè)置兩種屬性,分別為layout width與layout height(鍵入‘a(chǎn)ndroid:’并選擇對應(yīng)提示):

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

通過“wrap_content”,我們可以保證View的寬度足以容納其顯示內(nèi)容——這就避免了像布局那樣以填充方式顯示元素?,F(xiàn)在再為TextView添加另一項屬性,這一次通過列舉文本字符串實現(xiàn)顯示功能:

android:text="Hello there"

在保存文件之后,大家會看到Eclipse顯示出一條警告消息。如果將鼠標懸停在消息之上,編輯器的邊框處將顯示該文本——這部分內(nèi)容也會同時顯示 在Problem視圖當(dāng)中。警告內(nèi)容為“Hardcoded string……should use @string resource(硬編碼字符串……應(yīng)使用@string資源)?!毕到y(tǒng)推薦的做法是將每一個文本字符串值保存為一項值資源,而不應(yīng)將其直接包含在布局 XML當(dāng)中。盡管從起步階段來看這樣的處理方式既麻煩又毫無意義,但一旦養(yǎng)成良好習(xí)慣、大家會在今后的工作中逐漸發(fā)現(xiàn)其在大型項目中的價值。通過 Package Explorer找出“res/values/strings.xml”文件并打開,切換到“strings.xml”標簽并對代碼進行編輯。

5.3strings_edit

可以看到,Eclipse已經(jīng)添加了幾條字符串。要另行添加,只需為其設(shè)定名稱與值:

<string name="hello">Hello there</string>

這意味著如果大家需要在應(yīng)用程序UI當(dāng)中不止一次使用同一條字符串,而且稍后又需要對其進行修改,則只需在一處做出變更即可。保存字符串文件并切換到布局文件。將TextView的“text”屬性引用到值文件的對應(yīng)字符串中:

android:text="@string/hello"

我們通過在字符串名稱前加上“@string”的方式告知Android工具需要在哪里尋找字符串資源。這樣一來,警告信息就不會再出現(xiàn)了。 Eclipse通常會在我們編碼的過程中發(fā)出這些提醒,從而通知我們當(dāng)前存在的錯誤或者警示問題。大家可以選擇遵循或者忽略警告信息的內(nèi)容,但對于錯誤則 必須加以調(diào)整,否則應(yīng)用程序?qū)o法正常工作。

第二步

在TextView之后添加一個Button:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/click" />

在我們的示例中,Button使用的屬性與TextView相同。不過在其它情況下,它可能會使用更多屬性,而且一般來說不同視圖需要配合不同屬 性。按鈕上顯示的是“text”屬性值。將這條字符串同之前一樣添加到我們的“res/values/strings.xml”文件當(dāng)中:

<string name="click">Click Me!</string>

在接下來的教程中,我們將處理按鈕的點擊效果。切換到布局文件,查看編輯器右側(cè)的Outline視圖——它顯示的是另一套指向文件元素的界面。雙擊列出的項目以跳轉(zhuǎn)到對應(yīng)代碼位置。大家也可以展開或者折疊主元素。當(dāng)布局變得更加復(fù)雜時,這種處理方式就變得非常實用。

5.4layout_outline_view

提示:要整理Eclipse編輯中所打開的全部文件,我們只需按下“Ctrl+A”對其進行全選,然后按下“Ctrl+I”即可。

4. Graphical Layout

第一步

確保我們的布局文件已經(jīng)正確保存,然后切換到Graphical Layout標簽。

5.5graphical_layout_tab

大家可以看到自己所設(shè)計的布局已經(jīng)能夠直接查看。界面左側(cè)的Palette區(qū)域允許我們選擇UI組件并將其拖動到布局當(dāng)中。不過我們應(yīng)該首先使用XML,直至對基本框架擁有初步概念。XML能幫助我們控制細節(jié)設(shè)計,所以即使在使用圖形化工具的時候,我們也可能需要對XML結(jié)果進行編輯。

在Graphical Layout視圖上方是一套下拉清單,我們可以從中選擇用于查看布局效果的設(shè)備類型,其中也提供切換顯示方向及縮放效果的工具。大家需要在設(shè)計布局的過程 中不斷利用Graphical Layout對效果加以控制。另外,這里也提供其它一些值得嘗試的布局元素與設(shè)置。

第二步

大家可能已經(jīng)注意到,在這一次的布局設(shè)計當(dāng)中可見元素的顯示位置與屏幕上邊緣靠得比較近。下面就來解決這個問題。切換到XML編輯標簽并向LinearLayout當(dāng)中添加邊距屬性:

android:layout_margin="10dp"

我們使用“dp”來設(shè)置像素的獨立密度,這樣設(shè)計就會讓像素密度自動與用戶設(shè)備相匹配。保存文件并切換到Graphical Layout以查看實際效果。

5.6graphical_layout_effect

在我們進行布局設(shè)計時,Graphical Layout是一款非常實用的參考工具,但只能起到引導(dǎo)的效果。要了解我們的布局在應(yīng)用程序運行時以怎樣的方式顯示、又能實現(xiàn)怎樣的功能,大家需要將其載入虛擬或者物理設(shè)備進行實際難。我們會在后續(xù)文章中進一步討論這個話題。

5. 選項

大家可以在應(yīng)用程序屏幕中包含各類布局類型以及View,但其基本處理方式都是一致的。我們前面所使用的是LinearLayout,但還有其它多種方案可供選擇,其中比較常見的有RelativeLayout、FrameLayout、AbsoluteLayout以及GridLayout。大家 可以在LinearLayout Palette當(dāng)中找到這些類型,建議各位放松心態(tài)、在自己的View中任意選擇并觀察其顯示效果。當(dāng)添加來自Graphical Layout工具的元素時,請務(wù)必切換到XML以觀察新元素的加入會產(chǎn)生什么樣的標記代碼。

Android平臺針對多種常見需求提供View方案,例如單選按鈕、復(fù)選框以及文本輸入?yún)^(qū)等。這些方案能夠大大節(jié)約我們需要手動執(zhí)行的功能數(shù)量; 但如果各位需要使用非自帶UI元素,則需要創(chuàng)建一個自定義View類。一般來說,最好是在沒有其它選擇時再這樣處理,畢竟標準化UI元素在用戶設(shè)備上的表現(xiàn)更為可靠,同時也能節(jié)約開發(fā)及測試的時間。

總結(jié)

在今天的教程中,我們討論了Android平臺上用戶界面布局的基本設(shè)計流程,但并未做深層次挖掘。在本系列文章的下一部分,我們將嘗試在應(yīng)用程序添加用戶交互元素、檢測并響應(yīng)按鈕點擊。接下來,我們將著眼于同Android開發(fā)關(guān)系最密切的Java相關(guān)概念,并進一步探討應(yīng)用程序開發(fā)過程中所涉及的要素及實踐方式。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號