- 210808.《Learning Android中文版》学习笔记
- 211004.《Learning Android中文版》学习笔记
- 210808.《Learning Android中文版》学习笔记
- 210727.《Learning Android中文版》学习笔记
- 211004.《Learning Android中文版》学习笔记
- 210612.《Learning Android中文版》学习笔记
- 210615.《Learning Android中文版》学习笔记
- 210727.《Learning Android中文版》学习笔记
- 211012.《Learning Android中文版》学习笔记
- 210615.《Learning Android中文版》学习笔记
《Learning Android中文版》学习笔记06.4
6.4. StatusActivity的布局
接下来开始设计一个用户界面,用户可以在里面输入新消息并发布。
Eclipse默认会在res/layout下创建一个main.xml文件。出于一致性的考虑,我们将把它的名字改为status.xml以对应StatusActivity。在Eclipse中重命名一个文件,就右键点击它,选择Refactor→Rename…,输入新名字即可。Eclipse在重命名时会智能地做些同步工作,使所有引用到这个文件的地方保持一致。这在更新Java文件时可以做到完全自动,但对XML文件就不那么尽善尽美了。修改一个XML文件名,我们还需要手工修改Java代码中引用R类的相关部分。比如在这里,就需要将onCreate()方法中的setContentView(R.layout.main)修改为setContentView(R.layout.status)。
这个界面分为四部分:
屏幕上方显示的标题,TextView控件。
消息的输入框,在此使用EditText控件。
更新状态的按钮,Button控件。
一个容纳以上所有控件的Layout,它负责将这些控件垂直排开。在此选用前面提到的常用Layout之一——LinearLayout。
StatusActivity的源码大致如下:
例 6.1. res/layout/status.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- Main Layout of Status Activity -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- Title TextView-->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:gravity="center"
android:textSize="30sp"
android:layout_margin="10dp" android:text="@string/titleStatus"/>
<!-- Status EditText -->
<EditText android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_weight="1"
android:hint="@string/hintText" android:id="@+id/editText"
android:gravity="top|center_horizontal"></EditText>
<!-- Update Button -->
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/buttonUpdate"
android:textSize="20sp" android:id="@+id/buttonUpdate"></Button>
</LinearLayout>
以上代码由Eclipse Graphical Layout自动生成,它是作为Eclipse插件的Android Development Tools(ADT)的一部分,即编辑Android中XML文件的辅助工具,如 图 6.3. Graphical Layout模式下的status.xml。ADT可以辨认出这是在编辑用户界面的Layout,因此按照Graphical Layout模式打开status.xml,很方便就可以生成上述的代码。
图 6.3. Graphical Layout模式下的status.xml在前面的章节里,我们已对这些XML资源的概念略有提及,但是代码中存在的细节仍是需要在后面慢慢体会的。
控件的常用属性
一般来讲,这就是最常用的几个属性:
layout_height和layout_width
表示控件在父元素中占据的空间。在这里可以明确给出像素、英寸等单位的值,但这样是不提倡的。你的程序需要运行在不同的设备上,它们屏幕的尺寸会有不同,因此绝对大小不如相对大小。提倡的是,在这里给出fill_parent或者wrap_content,分别表示占据父元素的所有可用空间,或者仅占据自己全部显示所需要的最小空间。留意,自API level 8开始,fill_parent改为match_parent。
layout_weight
表示布局的权重,0或者1。比如消息框对应的EditText控件的默认布局权重是0,设定的布局高度(layout height)是fill_parent,而且它在发送按钮之前先一步申请空间,这样发送按钮就被挤出屏幕之外而无法显示了。为了让发送按钮显示出来,我们可以把消息框的布局权重设为1,这样它依然会在高度上占据尽可能多的空间,不过如果还有其它控件,就会为它们让出合适的空间,使之可以显示。
layout_gravity
指明这一控件在布局中所在的水平位置或垂直位置,可选的值为top、center、left等。若把某控件的宽度设为fill_parent,再给它一个center的水平位置显然是没有意义的。不过把控件的宽度设为wrap_content,再给它一个center的layout_gravity就令它居中。需要注意的是这个属性与下面gravity的区别。
gravity
指定控件的内容在这个控件中的位置。人们很容易将它与layout_gravity相混淆,实际上它们的应用场景不同。比如,我们作为标题的TextView的宽度设为fill_parent,那么设置它的layout_gravity就没有用处,不过将其gravity设为center可以让它的文字居中。
text
不是所有控件都有这个属性,但它十分常见,比如Button、EditText和TextView。它指定控件显示的文本。但是在这里直接输入文本是不被提倡的,因为这样就限制了程序的语言环境。好的做法是将所有的文本放到string.xml资源文件里,按照@string/titleStatusUpdate这样的形式引用它。
id
id是控件在layout资源文件中的唯一标识符。id对控件而言不是强制的,我也建议尽量少用id以减少重名的机会。但是在Java中需要引用控件的话,id是必须的。Id的格式为: @+id/someName,其中someName就是对应widget的名称。我个人的命名习惯是在名字前面加上类型,比如@+id/buttonUpdateStatus这样。
字符串资源
Android精细地划分了文件的职责:布局在资源文件中给出了定义,文本值(按钮的文本、标题等)也都独立到string.xml文件之中。这一来为程序提供多语言版本(英语、日语、俄语等)也就容易了许多,只需要提供另一个string资源文件即可。
现在string.xml的内容大致如下:
例 6.2. res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Yamba 1</string>
<string name="titleYamba">Yamba</string>
<string name="titleStatus">Status Update</string>
<string name="hintText">Please enter your 140-character status</string>
<string name="buttonUpdate">Update</string>
</resources>
就是一组键值对。
Tip:
对资源的命名,建议使用统一的的命名规范。比如titleYamba这个名字,就是以资源的用途——标题(title)——作为前缀。后跟一个名字(Yamba)。多个单词之间使用CamelCase命名法表示分隔。这样使得不同的资源容易区分,也容易查找。
网友评论