从布局 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)