標籤:
從布局 XML到視圖對象
在建立GeoQuiz項目的同時,也建立了一個名為QuizActivity的Activity子類。QuizActivity類檔案存放在項目的src目錄下。目錄src是項目全部Java原始碼的存放處。
開啟QuizActivity.java檔案,查看其中的代碼,如下:
package com.bignerdranch.android.geoquiz;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class QuizActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_quiz); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.quiz, menu); return true; } }
代碼清單1-4:QuizActivity的預設類檔案(QuizActivity.java)
該Java類檔案包含兩個Activity方法:onCreate(Bundle)和onCreateOptionsMenu(Menu)。
暫不用理會onCreateOptionsMenu(Menu)方法,第16章會詳細介紹它。
activity子類的執行個體建立後,onCreate(Bundle)方法將會被調用。activity建立後,它需要擷取並管理屬於自己的使用者介面。擷取activity的使用者介面,可調用以下Activity方法:
public void setContentView( int layoutResID )
通過傳入布局的資源ID參數,該方法產生指定布局的視圖並將其放置在螢幕上。布局檢視窗產生後,布局檔案包含的組件也隨之以各自的屬性定義完成執行個體化。
資源與資源ID
布局是一種資源。資源是應用非代碼形勢的內容,比像檔案、音頻檔案以及XML檔案等。
項目的所有資源檔都存放在目錄res的子目錄下。通過包瀏覽器可以看到,布局activity_quiz.xml資源檔存放在res/layout/目錄下。包含字串資源的strings檔案存放在res/values/目錄下。
在包瀏覽器展開目錄gen,找到並開啟R.java檔案,即可看到GeoQuiz應用當前所有的資源ID。R.java檔案在Android項目編譯過程中自動產生,遵照該檔案頭部的警示,請不要嘗試修改該檔案的內容。
/* AUTO-GENERATED FILE. DO NOT MODIFY. * * This class was automatically generated by the * aapt tool from the resource data it found. It * should not be modified by hand. */package com.bignerdranch.android.geoquiz;public final class R { public static final class attr { } public static final class dimen { /** Default screen margins, per the Android Design guidelines. Customize dimensions originally defined in res/values/dimens.xml (such as screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. */ public static final int activity_horizontal_margin=0x7f040000; public static final int activity_vertical_margin=0x7f040001; } public static final class drawable { public static final int ic_launcher=0x7f020000; } public static final class id { public static final int action_settings=0x7f080000; } public static final class layout { public static final int activity_quiz=0x7f030000; } public static final class menu { public static final int quiz=0x7f070000; } public static final class string { public static final int action_settings=0x7f050004; public static final int app_name=0x7f050000; public static final int false_button=0x7f050003; public static final int question_text=0x7f050001; public static final int true_button=0x7f050002; } ...}
代碼清單1-5:GeoQuiz應用當前的資源ID(R.java)
目前為止,我們還未在代碼中引用過字串,但如果需要,則應該使用以下方法:
setTitle( R.string.app_name );
要為組件產生資源ID,請在定義組件時為其添加上android:id屬性。在activity_quiz.xml檔案中,分別為兩個按鈕添加上android:id屬性,如代碼清單1-6所示。
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "match_parent" android:gravity = "center" android:orientation = "vertical" > <TextView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:padding = "24dp" android:text = "@string/question_text" /> <LinearLayout android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:orientation = "horizontal" > <Button android:id = "@+id/true_button" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/true_button" /> <Button android:id = "@+id/false_button" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:text = "@string/false_button" /> </LinearLayout> </LinearLayout>
代碼清單1-6:為按鈕添加資源ID(activity_quiz.xml)
請注意android:id屬性值前面有一個+標誌,而android:text屬性值則沒有,這是因為我們將要建立資源ID,而對字串資源只是做了引用。
儲存activity_quiz.xml檔案,重新查看R.java檔案,確認R.id內部類中產生了兩個新的資源ID,如代碼清單1-7所示。
public final class R {...public static final class id { public static final int action_settings=0x7f080002; public static final int false_button=0x7f080001; public static final int true_button=0x7f080000; }...
代碼清單1-7:新的資源ID(R.java)
(原創)《Android編程權威指南》學習筆記01-- Android應用初體驗--005