欢迎开始Android应用开发之旅!
本章节教你如何建立第一个 Android 应用程序:创建项目、运行可调试版本,以及一些应用程序设计基础——创建简单用户界面,并处理用户输入。
开始学习之前,确保你已经:
一、创建一个 LinearLayout
创建 Android 新项目,从 res/layout 打开 activity_my.xml,修改布局。修改后的 res/layout/activity_my.xml:
LinearLayout 是 ViewGroup 的子类,用于水平或垂直放置子视图,由 android:orientation 设定方向。子布局按 XML 里定义的顺序显示在屏幕上。
另外两个属性 android:layout_width 和 android:layout_height,所有 View 都要设置以指定尺寸。这里 LinearLayout 是根布局,宽高应充满整个屏幕,指定为 match_parent,表示子 View 扩张自己的宽高来匹配父控件。更多布局属性见 XML 布局向导。
二、添加一个文本输入框
与其它 View 一样,需要在 XML 里指定 EditText 的属性。在线性布局里:
-
在 activity_my.xml 的标签内定义 EditText,id 为 @+id/edit_message。 -
layout_width 和 layout_height 设为 wrap_content。 -
hint 属性引用字符串 edit_message。
res/layout/activity_my.xml:
android:id
这里定义 View 的唯一标识,可在代码里引用并读写(下一课会用到)。从 XML 使用资源必须用 @,后面是资源类型(这里是 id),然后是名字(edit_message)。其他类型的资源可以使用相同名字,只要类型不同。+ 只在第一次定义资源 ID 时需要,告诉 SDK 创建该 ID。编译后 SDK 可直接使用,会在 gen/R.java 里创建与 EditText 关联的标识。ID 创建之后,其他地方引用不再需要 +。这是唯一需要 + 的属性。文档:android:id。
android:layout_width 和 android:layout_height
不建议写死具体大小。wrap_content 让视图只占内容大小;若用 match_parent,EditText 会布满整个屏幕去适应父布局。更多见 布局向导。
android:hint
文本框为空时显示该字符串。@string/edit_message 应定义在单独的资源文件,不要把字符串写死在布局里。因为引用的是已有类型的资源,不需要 +;但若尚未定义该字符串,添加引用会出现编译错误。字符串资源与 id 使用了相同名称 edit_message,但引用区分类型,不会冲突。
三、增加字符串资源
默认项目包含 res/values/strings.xml。打开它,为 edit_message 增加字符串,值为 Enter a message.
-
在 Android Studio 从 res/values 打开 strings.xml。 -
添加 string 名为 “edit_message”,值为 “Enter a message”。 -
再添加 “button_send”,值为 “Send”(接下来会用到)。 -
删除 “hello world” 字符串。
定义好的 res/values/strings.xml:
界面上的文本都应该列入资源文件,方便单独修改,也方便按语言做本地化。参见 兼容不同的设备(Supporting Different Devices)。
四、添加一个按钮
-
编辑 res/layout 下的 activity_my.xml。 -
在 LinearLayout 内部、紧挨 EditText 定义 Button。 -
width 和 height 为 “wrap_content”,让按钮完整显示其上的文本。 -
android:text 引用前面定义的 button_send。
此时的 LinearLayout:
Note:宽和高设为 wrap_content,按钮只占文本大小。这个按钮不需要 android:id,因为 Activity 代码里不会引用它。
当前 EditText 和 Button 只适应各自内容的大小。这对按钮合适,对文本框不好——用户可能输入更长内容,最好占满屏幕宽度。LinearLayout 用权重达到这个目的,即 android:layout_weight。
权重按同级部件分配剩余空间,类似「两份伏特加、一份咖啡利口酒」。一个 View 权重 2、另一个 1,总数 3,分别占 2/3 和 1/3;再加第三个权重 1,则第一个占 1/2,另外两个各占 1/4。使用权重的前提一般是把宽或高设为 0dp,由系统按权重计算。很多情况下如果设了 match_parent,权重计算会变成反比:权重大的反而占空间小。所有 View 默认权重为 0;只给一个 View 权重大于 0,它就会占掉其余 View 自身之外的全部剩余空间。因此这里给 EditText 权重 1,让它占据除按钮之外的所有空间。
五、让输入框充满剩余宽度
-
在 activity_my.xml 里设置 EditText 的 layout_weight 为 1。 -
同时把 layout_width 设为 0dp。
为提升布局效率,设权重时应把 EditText 宽度设为 0dp。若仍用 wrap_content,系统还要先算内容宽度,而权重最终会占满剩余空间,width 就成了不起作用的属性。
完整布局文件:
六、运行应用
整个布局默认应用于创建项目时 SDK 工具自动生成的 Activity,运行看效果:
-
在 Android Studio 里点击工具栏 Run 按钮 
-
或者使用命令行,进入项目根目录直接执行。
| 步骤 | 关键属性 | 目的 |
|---|---|---|
| 根 LinearLayout | orientation=horizontal,宽高 match_parent | 横向排子视图并铺满屏幕 |
| EditText | id、wrap_content、hint | 输入框,空时显示提示 |
| 字符串资源 | edit_message / button_send | 文案进 strings.xml,方便改和本地化 |
| Button | wrap_content + text | 发送按钮,代码里可不引用 id |
| 权重 | layout_weight=1,layout_width=0dp | 输入框吃掉按钮以外的剩余宽度 |
一句话总结:先用 match_parent 的水平 LinearLayout 放下 EditText 和 Button,文案进字符串资源,再用 weight=1 且 width=0dp 让输入框铺满剩余空间。
转载请注明来源:欢迎开始Android应用开发之旅!







