2.3 更新视图层
了解了MVC设计模式后,现在来更新GeoQuiz应用的视图层,为其添加一个NEXT按钮。
在Android的世界里,视图对象通常由XML布局文件生成。GeoQuiz应用唯一的布局定义在activity_main.xml文件中。布局定义文件需要更新的地方如图2-5所示。(注意,为节约版面,不变的部件属性就不再列出了。)
图2-5 新增按钮
应用视图层所需的改动如下。
- 为TextView新增android:id属性。TextView部件需要资源ID,以便在MainActivity代码中为它设置要显示的文字。借助android:gravity="center",在TextView视图上居中显示文字。
- 删除TextView的android:text属性定义。用户点击问题时,代码会动态设置问题文本,而不再需要硬编码地理知识问题了。
指定显示在TextView视图上的默认文字,这样布局预览时就可以看到。实现方式是为TextView设置tools:text属性,使用@string/语法形式指向代表问题的字符串资源。
此外,还要在布局根标签处添加tools命名空间,让Android Studio知道tools:text属性的意思。该命名空间的作用是,在开发预览时让tools属性覆盖部件的其他属性。而在设备上运行时,系统会忽略该tools属性。当然,你仍然可以使用android:text,然后在代码运行时修改显示文字。但使用tools:text更好,因为一看便知它指定的值是仅供预览的。
以根LinearLayout为父部件,新增一个Button部件。
回到activity_main.xml文件中,参照代码清单2-2,完成XML文件的相应修改。
代码清单2-2 新增按钮以及对文本视图的调整(res/layout/activity_main.xml)
<LinearLayout 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" ... > <TextView android:id="@+id/question_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="24dp"android:text="@string/question_text"tools:text="@string/question_australia" /> <LinearLayout ... > ... </LinearLayout> <Button android:id="@+id/next_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/next_button" /> </LinearLayout>
保存activity_quiz.xml文件。这时,会看到一个错误提示,说缺少字符串资源。
回到res/values/strings.xml文件,如代码清单2-3所示,重命名question_text,添加新按钮所需的字符串资源定义。
代码清单2-3 更新字符串资源定义(res/values/strings.xml)
<string name="app_name">GeoQuiz</string><string name="question_text">Canberra is the capital of Australia.</string><string name="question_australia">Canberra is the capital of Australia.</string> <string name="true_button">True</string> <string name="false_button">False</string> <string name="next_button">Next</string> ...
既然已打开strings.xml文件,那就继续添加其他地理知识问题的字符串,结果如代码清单2-4所示。
代码清单2-4 新增问题字符串(res/values/strings.xml)
<string name="question_australia">Canberra is the capital of Australia.</string>
<string name="question_oceans">The Pacific Ocean is larger than
the Atlantic Ocean.</string>
<string name="question_mideast">The Suez Canal connects the Red Sea
and the Indian Ocean.</string>
<string name="question_africa">The source of the Nile River is in Egypt.</string>
<string name="question_americas">The Amazon River is the longest river
in the Americas.</string>
<string name="question_asia">Lake Baikal is the world\'s oldest and deepest
freshwater lake.</string>
...
注意最后一个字符串定义中的\'。为表示符号',这里使用了转义字符。在字符串资源定义中,也可使用其他常见的转义字符,比如\n是指新行符。
保存修改过的文件,然后回到activity_quiz.xml文件中,在图形布局工具里预览修改后的布局文件。
至此,GeoQuiz应用视图层的更新就全部完成了。为让GeoQuiz应用运行起来,接下来要更新控制层的MainActivity类。