Android 官方 Training 文檔學(xué)習(xí)總結(jié)系列
由于自己學(xué)習(xí) Android 到現(xiàn)在,都是通過視頻和書籍逗柴。感覺到現(xiàn)在還是什么都不會的狀態(tài)迁酸,比如實(shí)現(xiàn)一個小功能券膀,也許有思路,但是去實(shí)現(xiàn)卻實(shí)現(xiàn)不出來谷扣⊥寥回頭想想自己都學(xué)會了 Android 的哪些知識點(diǎn),一頭霧水会涎,回憶不起什么來裹匙,不知道學(xué)習(xí)了什么。
于是決定系統(tǒng)學(xué)習(xí)官方 Training 文檔末秃,學(xué)習(xí)不總結(jié)是不會提高的响蓉。也許之前學(xué)的一塌糊涂几颜,甚至導(dǎo)致學(xué)過之后都不知道學(xué)了什么,可能就是不總結(jié)不思考造成的。然后闹究,就有了這個系列的總結(jié)。
總結(jié)系列第一篇:My First App涉及知識點(diǎn)總結(jié)崎溃。代碼倉庫: Training First App
View
Android 應(yīng)用的圖形界面使用 View 對象以及 ViewGroup對象層次結(jié)構(gòu)而構(gòu)建侦厚。View 對象通常為按鈕或文本字段之類的 UI 小部件。而 ViewGroup 對象則為不可見的視圖容器劲阎,它們定義子視圖的布局绘盟。
替代布局
以 XML 格式(而不是運(yùn)行時代碼的方式)聲明 UI 布局有若干用處,但其中最重要的用處便是悯仙,可以創(chuàng)建不同的布局來適應(yīng)不同的屏幕尺寸龄毡。 例如,可以創(chuàng)建兩個版本的布局雁比,并指示系統(tǒng)在“小”屏幕上使用哪個版本稚虎,在“大”屏幕上使用哪個版本。
LinearLayout
LinearLayout 是一個視圖組(ViewGroup的子類)偎捎,它會按照 android:orientation 屬性的指定蠢终,將子視圖設(shè)置為垂直或水平方向布局。LinearLayout 的每個子視圖都會按照它們各自在 XML 中的出現(xiàn)順序顯示在屏幕上茴她。
如果 LinearLayout 是布局中的根視圖寻拂,則應(yīng)將寬度和高度設(shè)置為 "match_parent",從而填滿可供應(yīng)用使用的整個屏幕區(qū)域丈牢。 該值表示視圖應(yīng)擴(kuò)大其寬度或高度祭钉,以匹配父視圖的寬度或高度。
布局相關(guān)屬性
-
android:id
這會為視圖賦予唯一的標(biāo)識符己沛,可以使用該標(biāo)識符從應(yīng)用代碼中引用對象慌核,例如讀取和操作對象距境。
從 XML 引用任何資源對象時,都需要使用 @ 符號垮卓。 請?jiān)谠摲柡笠来屋斎胭Y源類型垫桂、斜杠和資源名稱:android:id="@+id/edit_message(例子)。
只有在第一次定義資源 ID 時粟按,才需要在資源類型之前加一個加號 (+)诬滩。 當(dāng)編譯應(yīng)用時,SDK 工具會使用 ID 名稱在項(xiàng)目的 R.java 文件中新建一個引用 EditText(例子) 元素的資源 ID灭将。一旦以此方式聲明資源 ID疼鸟,其他對該 ID 的引用皆無需使用加號。 只有在指定新資源 ID 時才必須使用加號庙曙,對于字符串或布局等具體資源則不必如此空镜。
-
android:layout_width 和 android:layout_height
"wrap_content" 值并不規(guī)定寬度和高度的具體大小,而是指定根據(jù)需要縮放視圖矾利,使其適合視圖的內(nèi)容姑裂。 如果要改用 "match_parent",則 EditText 元素將填滿屏幕男旗,因?yàn)樗鼤ヅ涓?LinearLayout(例子) 的大小舶斧。
-
android:hint
這是文本字段為空時顯示的默認(rèn)字符串。@string/edit_message(例子) 并非使用硬編碼字符串作為其值察皇,而是引用另一個文件中定義的一個字符串資源茴厉。 由于它引用的是一個具體資源(而不僅僅是標(biāo)識符),因此不需要加號什荣。
-
android:layout_weight
weight 值是一個數(shù)字矾缓,用于指定每個視圖與其他同級視圖在剩余空間中的占比。 這有點(diǎn)像飲料配方中各種成分的比例: “2 份蘇打稻爬、1 份糖漿”是指飲料中三分之二是蘇打嗜闻。例如,如果將一個視圖的 weight 值指定為 2桅锄,將另一個視圖的 weight 值指定為 1琉雳,總和是 3,那么第一個視圖將填滿剩余空間的 2/3友瘤,而第二個視圖則填滿其余部分翠肘。 如果添加了第三個視圖,將其 weight 值指定為 1辫秧,那么現(xiàn)在第一個視圖(weight 值為 2)將獲得 1/2 的剩余空間束倍,其余兩個視圖則各占 1/4。
所有視圖的默認(rèn) weight 值都為 0,所以如果僅將一個視圖的 weight 值指定為大于 0绪妹,那么等到其他所有視圖都獲得所需空間后甥桂,該視圖便會填滿所有剩余空間。
優(yōu)化: 如需使其一個部件的寬度或者高度占滿剩余屏幕空間時邮旷,例如在寬度方向占滿屏幕剩余空間格嘁。設(shè)置 android:layout_weight="1" 屬性后,將寬度設(shè)置為零 (0dp) 可提高布局性能廊移,這是因?yàn)槿绻麑挾仍O(shè)置為"wrap_content"或其他值,則會要求系統(tǒng)計算寬度探入,而該計算最終毫無意義狡孔,因?yàn)?weight 值還需要計算另一個寬度,才能填滿剩余空間蜂嗽。
注:對資源的引用始終都按資源類型(如 id 或 string)確定其作用域苗膝,因此使用相同的名稱不會引起沖突
資源對象
資源對象是一個唯一的整型名稱,它與應(yīng)用資源(如位圖植旧、布局文件或字符串)相關(guān)聯(lián)辱揭。
每個資源在項(xiàng)目的 R.java 文件中都定義有相應(yīng)的資源對象〔「剑可以使用 R 類中的對象名稱來引用資源问窃,例如當(dāng)需要為 android:hint 屬性指定字符串值時,就可以這樣做完沪。也可以使用 android:id 屬性創(chuàng)建任意與視圖相關(guān)聯(lián)的資源 ID域庇,從而可以從其他代碼中引用該視圖。
SDK 工具會在您每次編譯應(yīng)用時生成 R.java 文件覆积。切勿手動修改該文件听皿。
字符串資源
對于用戶界面中的文本,務(wù)必將每個字符串都指定為資源宽档。 字符串資源允許在單一位置管理所有 UI 文本尉姨,從而簡化文本的查找和更新。 此外吗冤,將字符串外部化還可為每個字符串資源提供替代定義又厉,從而將應(yīng)用本地化為不同的語言。
響應(yīng)按鈕
可在布局文件的 Button 元素中添加 android:onClick 屬性欣孤,如 android:onClick="sendMessage"馋没。每次用戶點(diǎn)擊按鈕時,此屬性均會提示系統(tǒng)調(diào)用 Activity 中的 sendMessage() 方法降传。
還需在布局文件對應(yīng)的 Activity 類中添加與 onClick 屬性對應(yīng)的方法篷朵。如:
/**Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
要讓系統(tǒng)將此方法與為 android:onClick 指定的方法名稱匹配,簽名必須與所示內(nèi)容完全相同。具體而言声旺,該方法必須:
- 是公共方法
- 具有空返回值
- 以 View 作為唯一參數(shù)(這將是之前點(diǎn)擊的 View)
Intent
Intent 是指在相互獨(dú)立的組件(如兩個 Activity)之間提供運(yùn)行時綁定功能的對象笔链。Intent 表示一個應(yīng)用“執(zhí)行某項(xiàng)操作的 Intent”。 可以將 Intent 用于各種任務(wù)腮猖。例如:Intent 用于啟動另一個 Activity鉴扫。
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
Intent 構(gòu)造函數(shù)采用兩個參數(shù):
- Context 是第一個參數(shù)(之所以使用 this ,是因?yàn)?Activity 類是 Context 的子類)
- 應(yīng)用組件的 Class澈缺,系統(tǒng)應(yīng)將 Intent(在本例中坪创,為應(yīng)啟動的 Activity)傳遞至該類。
putExtra() 方法將 EditText 的值添加到 Intent姐赡。Intent 能夠以名為 extra 的鍵值對形式攜帶數(shù)據(jù)類型莱预。鍵是一個公共常量 EXTRA_MESSAGE,因?yàn)橄乱粋€ Activity 將使用該鍵來檢索文本值项滑。為 Intent extra 定義鍵時最好使用應(yīng)用的軟件包名稱作為前綴依沮。這可以確保在應(yīng)用與其他應(yīng)用交互過程中這些鍵始終保持唯一。
startActivity() 方法將啟動 Intent 指定的 DisplayMessageActivity 實(shí)例枪狂。
編寫 DisplayMessageActivity.java 類危喉,用于顯示第一個 Activity 傳遞的消息。代碼如下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
ViewGroup layout = (ViewGroup) findViewById(R.id.activity_display_message);
layout.addView(textView);
}
此處會執(zhí)行大量操作州疾,因此我們接著解釋:
- 調(diào)用 getIntent() 采集啟動 Activity 的 intent辜限。無論用戶如何導(dǎo)航到目的地,每個 Activity 都由一個 Intent 調(diào)用孝治。 調(diào)用 getStringExtra() 將檢索第一個 Activity 中的數(shù)據(jù)列粪。
- 可以使用編程方式創(chuàng)建 TextView 并設(shè)置其大小和消息。
- 可將 TextView 添加到 R.id.activity_display_message 標(biāo)識的布局谈飒∑褡可將布局投射到 ViewGroup,因?yàn)樗撬胁季值某惽野?addView() 方法杭措。
布局
布局定義用戶界面的視覺結(jié)構(gòu)费什,如Activity或應(yīng)用小部件的 UI∈炙兀可以通過兩種方式聲明布局:
- 在 XML 中聲明 UI 元素鸳址。Android 提供了對應(yīng)于 View 類及其子類的簡明 XML 詞匯,如用于小部件和布局的詞匯泉懦;
- 運(yùn)行時實(shí)例化布局元素稿黍。應(yīng)用可以通過編程創(chuàng)建 View 對象和 ViewGroup 對象(并操縱其屬性)。
Android 框架可以靈活地使用以下一種或兩種方法來聲明和管理應(yīng)用的 UI崩哩。例如巡球,可以在 XML 中聲明應(yīng)用的默認(rèn)布局言沐,包括將出現(xiàn)在布局中的屏幕元素及其屬性。然后酣栈,可以在應(yīng)用中添加可在運(yùn)行時修改屏幕對象(包括那些已在 XML 中聲明的對象)狀態(tài)的代碼险胰。
在 XML 中聲明 UI 的優(yōu)點(diǎn)在于,可以更好地將應(yīng)用的外觀與控制應(yīng)用行為的代碼隔離矿筝。UI 描述位于應(yīng)用代碼外部起便,這意味著在修改或調(diào)整描述時無需修改源代碼并重新編譯。例如窖维,可以創(chuàng)建適用于不同屏幕方向榆综、不同設(shè)備屏幕尺寸和不同語言的 XML 布局。此外铸史,在 XML 中聲明布局還能更輕松地顯示 UI 的結(jié)構(gòu)奖年,從而簡化問題調(diào)試過程。
一般而言沛贪,用于聲明 UI 元素的 XML 詞匯嚴(yán)格遵循類和方法的結(jié)構(gòu)和命名方式,其中元素名稱對應(yīng)于類名稱震贵,屬性名稱對應(yīng)于方法利赋。實(shí)際上,這種對應(yīng)關(guān)系往往非常直接猩系,可以猜到對應(yīng)于類方法的 XML 屬性媚送,或?qū)?yīng)于給定 XML 元素的類。但請注意寇甸,并非所有詞匯都完全相同塘偎。在某些情況下,在命名上略有差異拿霉。例如吟秩,EditText 元素具有的 text 屬性對應(yīng)的類方法是 EditText.setText()。
編寫 XML
可以利用 Android 的 XML 詞匯绽淘,按照在 HTML 中創(chuàng)建包含一系列嵌套元素的網(wǎng)頁的相同方式快速設(shè)計 UI 布局及其包含的屏幕元素涵防。
每個布局文件都必須只包含一個根元素,并且該元素必須是視圖對象或 ViewGroup 對象沪铭。定義根元素之后壮池,即可再以子元素的形式添加其他布局對象或小部件,從而逐步構(gòu)建定義布局的視圖層次結(jié)構(gòu)杀怠。例如椰憋,以下這個 XML 布局使用垂直 LinearLayout 來儲存一個 TextView 和一個 Button:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
在 XML 中聲明布局后,請?jiān)?Android 項(xiàng)目 res/layout/ 目錄中以 .xml 擴(kuò)展名保存文件赔退,以便其能夠正確編譯橙依。
加載 XML 資源
當(dāng)編譯應(yīng)用時,每個 XML 布局文件都會編譯到一個 View 資源中。 應(yīng)該在 Activity.onCreate() 回調(diào)實(shí)現(xiàn)中從應(yīng)用代碼加載布局資源票编。通過調(diào)用 setContentView()褪储,以 R.layout.layout_file_name 形式向其傳遞對布局資源的引用來執(zhí)行此操作。例如慧域,如果 XML 布局保存為 main_layout.xml鲤竹,則需要像下面這樣為 Activity 加載該布局:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
}
啟動 Activity 時,Android 框架會調(diào)用 Activity 中的 onCreate() 回調(diào)方法
屬性
每個視圖對象和 ViewGroup 對象都支持各自的各類 XML 屬性昔榴。某些屬性是視圖對象的專用屬性(例如辛藻,TextView 支持 textSize 屬性),但這些屬性也會被任何可以擴(kuò)展此類的視圖對象繼承互订。某些屬性通用于所有 View 對象吱肌,因?yàn)樗鼈兝^承自根 View 類(如 id 屬性)。此外仰禽,其他屬性被視為“布局參數(shù)”氮墨,即描述 View 對象特定布局方向的屬性,如該對象的父 ViewGroup 對象所定義的屬性吐葵。
-
ID
任何視圖對象都可能具有關(guān)聯(lián)的整型 ID规揪,此 ID 用于在結(jié)構(gòu)樹中對 View 對象進(jìn)行唯一標(biāo)識。編譯應(yīng)用后温峭,此 ID 將作為整型數(shù)引用猛铅,但在布局 XML 文件中,通常會在 id 屬性中為該 ID 賦予字符串值凤藏。這是所有 View 對象共用的 XML 屬性(由 View 類定義)奸忽,經(jīng)常會用到它。XML 標(biāo)記內(nèi)部的 ID 語法是:
android:id="@+id/my_button"
字符串開頭處的 @ 符號指示 XML 解析程序應(yīng)該解析并展開 ID 字符串的其余部分揖庄,并將其標(biāo)識為 ID 資源栗菜。加號 (+) 表示這是一個新的資源名稱,必須創(chuàng)建該名稱并將其添加到我們的資源(在 R.java 文件中)內(nèi)蹄梢。Android 框架還提供了許多其他 ID 資源苛萎。 引用 Android 資源 ID 時,不需要加號检号,但必須添加 android 軟件包命名空間腌歉,如下所示:
android:id="@android:id/empty"
添加 android 軟件包命名空間之后,現(xiàn)在齐苛,將從 android.R 資源類而非本地資源類引用 ID翘盖。
要想創(chuàng)建視圖并從應(yīng)用中引用它們,常見的模式是:
- 在布局文件中定義一個視圖/小部件凹蜂,并為其分配一個唯一的 ID:
<Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/my_button_text"/>
- 然后創(chuàng)建一個 view 對象實(shí)例馍驯,并從布局中捕獲它(通常使用 onCreate() 方法):
Button myButton = (Button)findViewById(R.id.my_button);
創(chuàng)建 RelativeLayout 時阁危,為 view 對象定義 ID 非常重要。在相對布局中汰瘫,同級視圖可以定義其相對于其他同級視圖的布局狂打,同級視圖通過唯一的 ID 進(jìn)行引用。
ID 不需要在整個結(jié)構(gòu)樹中具有唯一性混弥,但在要搜索的結(jié)構(gòu)樹部分應(yīng)具有唯一性(要搜索的部分往往是整個結(jié)構(gòu)樹趴乡,因此最好盡可能具有全局唯一性)。
- 在布局文件中定義一個視圖/小部件凹蜂,并為其分配一個唯一的 ID:
-
布局參數(shù)
名為 layout_something 的 XML 布局屬性可為視圖定義與其所在的 ViewGroup 相適的布局參數(shù)蝗拿。
每個 ViewGroup 類都會實(shí)現(xiàn)一個擴(kuò)展 ViewGroup.LayoutParams 的嵌套類晾捏。此子類包含的屬性類型會根據(jù)需要為視圖組的每個子視圖定義尺寸和位置。 正如在下圖中所見哀托,父視圖組為每個子視圖(包括子視圖組)定義布局參數(shù)惦辛。
請注意仓手,每個 LayoutParams 子類都有自己的值設(shè)置語法胖齐。 每個子元素都必須定義適合其父元素的 LayoutParams,但父元素也可為其子元素定義不同的 LayoutParams嗽冒。
所有視圖組都包括寬度和高度(layout_width 和 layout_height)市怎,并且每個視圖都必須定義它們。許多 LayoutParams 還包括可選的外邊距和邊框辛慰。
可以指定具有確切尺寸的寬度和高度,但多半不想經(jīng)常這樣做干像。 在更多的情況下帅腌,會使用以下常量之一來設(shè)置寬度或高度:
- wrap_content 指示您的視圖將其大小調(diào)整為內(nèi)容所需的尺寸。
- match_parent 指示您的視圖盡可能采用其父視圖組所允許的最大尺寸麻汰。
一般而言速客,建議不要使用絕對單位(如像素)來指定布局寬度和高度, 而是使用相對測量單位五鲫,如密度無關(guān)像素單位 (dp)溺职、wrap_content 或 match_parent,這種方法更好位喂,因?yàn)樗兄诖_保應(yīng)用在各類尺寸的設(shè)備屏幕上正確顯示浪耘。
布局位置
視圖的幾何形狀就是矩形的幾何形狀。視圖具有一個位置(以一對水平向左和垂直向上坐標(biāo)表示)和兩個尺寸(以寬度和高度表示)塑崖。 位置和尺寸的單位是像素七冲。
可以通過調(diào)用方法 getLeft() 和方法 getTop() 來檢索視圖的位置。前者會返回表示視圖的矩形的水平向左(或稱 X 軸) 坐標(biāo)规婆。后者會返回表示視圖的矩形的垂直向上(或稱 Y 軸)坐標(biāo)澜躺。 這些方法都會返回視圖相對于其父項(xiàng)的位置蝉稳。 例如,如果 getLeft() 返回 20掘鄙,則意味著視圖位于其直接父項(xiàng)左邊緣向右 20 個像素處耘戚。
此外,系統(tǒng)還提供了幾種便捷方法來避免不必要的計算操漠,即 getRight() 和 getBottom()收津。 這些方法會返回表示視圖的矩形的右邊緣和下邊緣的坐標(biāo)。 例如颅夺,調(diào)用 getRight() 類似于進(jìn)行以下計算:getLeft() + getWidth()朋截。
尺寸、內(nèi)邊距和外邊距
視圖的尺寸通過寬度和高度表示吧黄。視圖實(shí)際上具有兩對寬度和高度值部服。
第一對稱為測量寬度和測量高度。 這些尺寸定義視圖想要在其父項(xiàng)內(nèi)具有的大小拗慨。 這些測量尺寸可以通過調(diào)用 getMeasuredWidth() 和 getMeasuredHeight() 來獲得廓八。
第二對簡稱為寬度和高度,有時稱為繪制寬度和繪制高度赵抢。 這些尺寸定義視圖在繪制時和布局后在屏幕上的實(shí)際尺寸剧蹂。 這些值可以(但不必)與測量寬度和測量高度不同。 寬度和高度可以通過調(diào)用 getWidth() 和 getHeight() 來獲得烦却。
要想測量其尺寸宠叼,視圖需要將其內(nèi)邊距考慮在內(nèi)。內(nèi)邊距以視圖左側(cè)其爵、頂部冒冬、右側(cè)和底部各部分的像素數(shù)表示。 內(nèi)邊距可用于以特定數(shù)量的像素彌補(bǔ)視圖的內(nèi)容摩渺。 例如简烤,左側(cè)內(nèi)邊距為 2,會將視圖的內(nèi)容從左邊緣向右推 2 個像素摇幻。 可以使用 setPadding(int, int, int, int) 方法設(shè)置內(nèi)邊距横侦,并通過調(diào)用 getPaddingLeft()、getPaddingTop()绰姻、getPaddingRight() 和 getPaddingBottom() 進(jìn)行查詢枉侧。
盡管視圖可以定義內(nèi)邊距,但它并不支持外邊距狂芋。 不過棵逊,視圖組可以提供此類支持。
常見布局
ViewGroup 類的每個子類都提供了一種獨(dú)特的方式來顯示在其中嵌套的視圖银酗。以下是 Android 平臺中內(nèi)置的一些較為常見的布局類型辆影。
注:盡管可以通過將一個或多個布局嵌套在另一個布局內(nèi)來實(shí)現(xiàn)您的 UI 設(shè)計徒像,但應(yīng)該使您的布局層次結(jié)構(gòu)盡可能簡略。布局的嵌套布局越少蛙讥,繪制速度越快(扁平的視圖層次結(jié)構(gòu)優(yōu)于深層的視圖層次結(jié)構(gòu))锯蛀。
線性布局: 一種使用單個水平行或垂直行來組織子項(xiàng)的布局。它會在窗口長度超出屏幕長度時創(chuàng)建一個滾動條次慢。
相對布局: 能夠指定子對象彼此之間的相對位置(子對象 A 在子對象 B 左側(cè))或子對象與父對象的相對位置(與父對象頂部對齊)旁涤。
網(wǎng)頁視圖: 顯示網(wǎng)頁。
使用適配器構(gòu)建布局
如果布局的內(nèi)容是屬于動態(tài)或未預(yù)先確定的內(nèi)容迫像,您可以使用這樣一種布局:在運(yùn)行時通過子類 AdapterView 用視圖填充布局劈愚。 AdapterView 類的子類使用 Adapter 將數(shù)據(jù)與其布局綁定。Adapter 充當(dāng)數(shù)據(jù)源與 AdapterView 布局之間的中間人—Adapter(從數(shù)組或數(shù)據(jù)庫查詢等來源)檢索數(shù)據(jù)闻妓,并將每個條目轉(zhuǎn)換為可以添加到 AdapterView 布局中的視圖菌羽。
適配器支持的常見布局包括:
列表視圖: 顯示滾動的單列列表。
網(wǎng)格視圖: 顯示滾動的行列網(wǎng)格由缆。
-
使用數(shù)據(jù)填充適配器視圖
可以通過將 AdapterView 實(shí)例與 Adapter 綁定來填充 AdapterView(如 ListView 或 GridView)注祖,此操作會從外部來源檢索數(shù)據(jù),并創(chuàng)建表示每個數(shù)據(jù)條目的 View均唉。
Android 提供了幾個 Adapter 子類是晨,用于檢索不同種類的數(shù)據(jù)和構(gòu)建 AdapterView 的視圖。 兩種最常見的適配器是:
-
ArrayAdpater:
請?jiān)跀?shù)據(jù)源為數(shù)組時使用此適配器舔箭。默認(rèn)情況下罩缴,ArrayAdapter 會通過在每個項(xiàng)目上調(diào)用 toString() 并將內(nèi)容放入 TextView 來為每個數(shù)組項(xiàng)創(chuàng)建視圖。
例如层扶,如果具有想要在 ListView 中顯示的字符串?dāng)?shù)組箫章,請使用構(gòu)造函數(shù)初始化一個新的 ArrayAdapter,為每個字符串和字符串?dāng)?shù)組指定布局:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStringArray);
此構(gòu)造函數(shù)的參數(shù)是:
- 應(yīng)用 Context
- 包含數(shù)組中每個字符串的 TextView 的布局
- 字符串?dāng)?shù)組
然后怒医,只需在 ListView 上調(diào)用 setAdapter():
ListView listView = (ListView) findViewById(R.id.listview); listView.setAdapter(adapter);
要想自定義每個項(xiàng)的外觀,您可以重寫數(shù)組中各個對象的 toString() 方法奢讨≈商荆或者,要想為 TextView 之外的每個項(xiàng)創(chuàng)建視圖(例如拿诸,如果想為每個數(shù)組項(xiàng)創(chuàng)建一個 ImageView)扒袖,請擴(kuò)展 ArrayAdapter 類并重寫 getView() 以返回想要為每個項(xiàng)獲取的視圖類型。
-
SimpleCursorAdapter:
請?jiān)跀?shù)據(jù)來自 Cursor 時使用此適配器亩码。使用 SimpleCursorAdapter 時季率,必須指定要為 Cursor 中的每個行使用的布局,以及應(yīng)該在哪些布局視圖中插入 Cursor 中的哪些列描沟。 例如飒泻,如果想創(chuàng)建人員姓名和電話號碼列表鞭光,則可以執(zhí)行一個返回 Cursor(包含對應(yīng)每個人的行,以及對應(yīng)姓名和號碼的列)的查詢泞遗。 然后惰许,可以創(chuàng)建一個字符串?dāng)?shù)組,指定想要在每個結(jié)果的布局中包含 Cursor 中的哪些列史辙,并創(chuàng)建一個整型數(shù)組汹买,指定應(yīng)該將每個列放入的對應(yīng)視圖:
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER}; int[] toViews = {R.id.display_name, R.id.phone_number};
當(dāng)實(shí)例化 SimpleCursorAdapter 時,請傳遞要用于每個結(jié)果的布局聊倔、包含結(jié)果的 Cursor 以及以下兩個數(shù)組:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.person_name_and_number, cursor, fromColumns, toViews, 0); ListView listView = getListView(); listView.setAdapter(adapter);
然后晦毙,SimpleCursorAdapter 會使用提供的布局,將每個 fromColumns 項(xiàng)插入對應(yīng)的 toViews 視圖耙蔑,為 Cursor 中的每個行創(chuàng)建一個視圖见妒。
如果在應(yīng)用的生命周期中更改了適配器讀取的底層數(shù)據(jù),則應(yīng)調(diào)用 notifyDataSetChanged()纵潦。此操作會通知附加的視圖徐鹤,數(shù)據(jù)發(fā)生了變化,它應(yīng)該自行刷新邀层。
-
處理點(diǎn)擊事件
可以通過實(shí)現(xiàn) AdapterView.OnItemClickListener 界面來響應(yīng) AdapterView 中每一項(xiàng)上的點(diǎn)擊事件返敬。 例如:
// 創(chuàng)建一個匿名類作為消息處理對象。
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
// Do something in response to the click
}
};
listView.setOnItemClickListener(mMessageClickedHandler);
ikook
2017.03.21