此 Codelab 是“Android Kotlin 基础知识”课程的一部分。如果您按顺序学习这些 Codelab,您将会充分发掘此课程的价值。“Android Kotlin 基础知识”Codelab 着陆页列出了所有课程 Codelab。
您应当已掌握的内容
- 使用 Kotlin 创建基本 Android 应用。
- 在模拟器或设备上运行 Android 应用。
- 使用 Android Studio 的布局编辑器创建线性布局。
- 创建一个使用
LinearLayout、TextView、ScrollView和一个带有点击处理程序的按钮的简单应用。
学习内容
- 如何使用
EditText视图获取用户输入。 - 如何使用
EditText视图中的文本为TextView视图设置文本。 - 如何使用
View和ViewGroup。 - 如何更改
View的公开范围。
您将执行的操作
- 向之前的 Codelab 中的 AboutMe 应用添加互动功能。
- 添加一个
EditText,以便用户可以输入文字。 - 添加
Button并实现其点击处理程序。
在此 Codelab 中,您将扩展 AboutMe 应用以添加用户互动功能。您添加了一个昵称字段、一个完成按钮和一个用于显示昵称的文本视图。用户输入昵称并点按 DONE 按钮后,文本视图会更新以显示输入的昵称。用户可以点按文本视图再次更新昵称。
|
|
在此任务中,您将添加一个 EditText 输入字段,以允许用户输入昵称。
第 1 步:开始使用
- 如果您还没有上一个 Codelab 中的 AboutMe 应用,请下载起始代码 AboutMeInteractive-Starter。此代码与您在之前的 Codelab 中完成的代码相同。
- 在 Android Studio 中打开 AboutMeInteractive-Starter 项目。
- 运行应用。您会看到一个名称文本视图、一个星形图片和一个滚动视图中的长文本段。

请注意,用户无法更改任何文本。
如果用户可以与应用互动(例如输入文字),应用会更有趣。为了接受文本输入,Android 提供了一个名为编辑文本的界面 (UI) widget。您可以使用 TextView 的子类 EditText 定义编辑文本。编辑文本可让用户输入和修改文本输入,如下面的屏幕截图所示。

第 2 步:添加 EditText
- 在 Android Studio 中,打开 Design 标签页中的
activity_main.xml布局文件。 - 在 Palette 窗格中,点击 Text。

Ab TextView(即TextView)会显示在 Palette 窗格中的文本元素列表顶部。Ab TextView 下方有多个EditText视图。
在调色板窗格中,请注意TextView的图标如何显示没有下划线的字母 Ab。不过,EditText图标显示的是带下划线的 Ab 。下划线表示相应视图可编辑。
对于每个EditText视图,Android 会设置不同的属性,并且系统会显示相应的软键盘输入法(例如屏幕键盘)。 - 将 PlainText 编辑文本拖动到 Component Tree 中,并将其放置在
name_text下方和star_image上方。
- 使用属性 窗格在
EditText视图中设置以下属性。
属性 | 值 |
|
|
|
|
|
|
- 运行您的应用。在星形图片上方,您会看到一个包含默认文本“名称”的编辑文本。

在此任务中,您将通过添加提示、更改文字对齐方式、将样式更改为 NameStyle 以及设置输入类型来设置 EditText 视图的样式。
第 1 步:添加提示文字
- 在
string.xml文件中为提示添加新的字符串资源。
<string name="what_is_your_nickname">What is your Nickname?</string>- 使用属性 窗格将以下属性设置为
EditText视图:
属性 | 值 |
|
|
|
|
|
|
- 在 Attributes 窗格中,从
text属性中移除Name值。text属性值需要为空,以便显示提示。
第 2 步:设置 inputType 属性
inputType 属性用于指定用户可在 EditText 视图中输入的输入类型。Android 系统会根据设置的输入类型显示相应的输入字段和屏幕键盘。
如需查看所有可能的输入类型,请在属性窗格中点击 inputType 字段,或点击该字段旁边的三点状图标 ...。系统会打开一个列表,其中显示您可以使用的所有输入类型,并勾选当前有效的输入类型。您可以选择多个输入源类型。

例如,对于密码,请使用 textPassword 值。文本字段会隐藏用户输入的内容。

对于电话号码,请使用 phone 值。系统会显示数字键盘,用户只能输入数字。

为昵称字段设置输入类型:
- 将
nickname_edit编辑文本的inputType属性设置为textPersonName。 - 在 Component Tree 窗格中,您会看到
autoFillHints警告。此警告不适用于此应用,并且超出了本 Codelab 的范围,因此您可以忽略它。(如果您想详细了解自动填充,请参阅针对自动填充优化应用。)
- 在属性 窗格中,验证
EditText视图的以下属性的值:
属性 | 值 |
|
|
|
|
|
|
|
|
|
|
|
|
| (空) |
Button 是一种界面元素,用户可以通过点按该元素来执行操作。按钮可以包含文字、图标,也可以同时包含文字和图标。

在此任务中,您将添加一个 DONE 按钮,用户在输入昵称后会点按该按钮。该按钮可将 EditText 视图切换为显示昵称的 TextView 视图。如需更新昵称,用户可以点按 TextView 视图。
第 1 步:添加“完成”按钮
- 将按钮从 Palette 窗格拖动到 Component Tree 中。将按钮放置在
nickname_edit编辑文本下方。

- 创建一个名为
done的新字符串资源。将字符串的值设为Done,
<string name="done">Done</string>- 使用属性窗格在新添加的
Button视图中设置以下属性:
属性 | 值 |
|
|
|
|
|
|
|
|
layout_gravity 属性可将视图在其父级布局 LinearLayout 中居中。
- 将样式更改为
Widget.AppCompat.Button.Colored,这是 Android 提供的一种预定义样式。您可以从下拉菜单或资源窗口中选择样式。
此样式会将按钮颜色更改为强调色colorAccent。强调色在res/values/colors.xml文件中定义。
colors.xml 文件包含应用的默认颜色。您可以根据应用的要求,在项目中添加新的颜色资源或更改现有的颜色资源。
colors.xml 文件示例:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
</resources>第 2 步:设置“完成”按钮的样式
- 在属性窗格中,依次选择 Layout_Margin > Top,添加上边距。将上边距设置为
layout_margin,该值在dimens.xml文件中定义。
- 从下拉菜单中将
fontFamily属性设置为roboto。
- 切换到 Text 标签页,并验证新添加的按钮的生成的 XML 代码。
<Button
android:id="@+id/done_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/layout_margin"
android:fontFamily="@font/roboto"
android:text="@string/done" />第 3 步:更改颜色资源
在此步骤中,您将更改按钮的强调色,使其与 activity 的应用栏相匹配。
- 打开
res/values/colors.xml,并将colorAccent的值更改为#76bf5e。
<color name="colorAccent">#76bf5e</color>您可以在文件编辑器的左侧边距中看到与十六进制代码对应的颜色。

注意设计编辑器中按钮颜色的变化。
- 运行应用。您应该会在编辑文本下方看到一个样式化的 DONE 按钮。

用户输入昵称并点按 DONE 按钮后,昵称会显示在 TextView 视图中。在此任务中,您将添加一个带有彩色背景的文本视图。文本视图会在 star_image 上方显示用户的昵称。
第 1 步:为昵称添加 TextView
- 将文本视图从 Palette 窗格拖动到 Component Tree 中。将文本视图放置在
done_button下方和star_image上方。
- 使用属性窗格为新的
TextView视图设置以下属性:
属性 | 值 |
|
|
|
|
|
|
第 2 步:更改 TextView 的可见性
您可以使用 visibility 属性在应用中显示或隐藏视图。此属性可接受以下三个值之一:
visible:视图处于可见状态。Invisible:隐藏视图,但视图仍会占用布局中的空间。gone:隐藏视图,并且该视图不会占用布局中的任何空间。
- 在属性窗格中,将
nickname_text文本视图的visibility设置为gone,因为您不希望应用一开始就显示此文本视图。
请注意,当您在属性窗格中更改属性时,nickname_text视图会从设计器中消失。视图在布局预览中处于隐藏状态。 - 将
nickname_text视图的text属性值更改为空字符串。
为此 TextView 生成的 XML 代码应如下所示:
<TextView
android:id="@+id/nickname_text"
style="@style/NameStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAlignment="center"
android:visibility="gone"
android:text="" />布局预览应如下所示:

Button 对象(或任何视图)上的点击处理程序用于指定在点按按钮(视图)时要执行的操作。处理点击事件的函数应在托管包含按钮(视图)的布局的 Activity 中实现。
点击监听器通常采用以下格式,其中传入的视图是接收点击或点按的视图。
private fun clickHandlerFunction(viewThatIsClicked: View) {
// Add code to perform the button click event
}您可以通过以下两种方式将点击监听器函数附加到按钮点击事件:
- 在 XML 布局中,您可以将
android:onClick属性添加到<Button>元素。例如:
<Button
android:id="@+id/done_button"
android:text="@string/done"
...
android:onClick="clickHandlerFunction"/>或
- 您可以在运行时通过编程方式在
Activity的onCreate()中调用setOnClickListener来实现此目的。例如:
myButton.setOnClickListener {
clickHanderFunction(it)
}在此任务中,您将以编程方式为 done_button 添加点击监听器。您可以在相应 activity(即 MainActivity.kt)中添加点击监听器。
您的点击监听器函数(名为 addNickname)将执行以下操作:
- 从
nickname_edit编辑文本中获取文本。 - 设置
nickname_text文本视图中的文本。 - 隐藏编辑文本和按钮。
- 显示昵称
TextView。
第 1 步:添加点击监听器
- 在 Android Studio 的
java文件夹中,打开MainActivity.kt文件。 - 在
MainActivity.kt的MainActivity类中,添加一个名为addNickname的函数。包含一个名为view且类型为View的输入参数。view参数是调用函数的View。在这种情况下,view将是完成按钮的实例。
private fun addNickname(view: View) {
}- 在
addNickname函数内,使用findViewById()获取对nickname_edit编辑文本和nickname_text文本视图的引用。
val editText = findViewById<EditText>(R.id.nickname_edit)
val nicknameTextView = findViewById<TextView>(R.id.nickname_text)- 将
nicknameTextView文本视图中的文本设置为用户在editText中输入的文本,并从text属性中获取该文本。
nicknameTextView.text = editText.text- 通过将
editText的visibility属性设置为View.GONE,隐藏昵称EditText视图。
在之前的任务中,您使用布局编辑器更改了 visibility 属性。在这里,您可以通过编程方式执行相同的操作。
editText.visibility = View.GONE- 通过将
visibility属性设置为View.GONE来隐藏完成按钮。您已将按钮的引用作为函数的输入形参view。
view.visibility = View.GONE- 在
addNickname函数的末尾,通过将昵称TextView视图的visibility属性设置为View.VISIBLE,使该视图可见。
nicknameTextView.visibility = View.VISIBLE第 2 步:将点击监听器附加到“DONE”按钮
现在,您已经有了一个函数,用于定义点按完成按钮时要执行的操作,接下来需要将该函数附加到 Button 视图。
- 在
MainActivity.kt中,于onCreate()函数的末尾,获取对 DONEButton视图的引用。使用findViewById()函数并调用setOnClickListener。传入对点击监听器函数addNickname()的引用。
findViewById<Button>(R.id.done_button).setOnClickListener {
addNickname(it)
}在上述代码中,it 是指 done_button,即作为实参传递的视图。
- 运行应用,输入昵称,然后点按 DONE 按钮。请注意,编辑文本和按钮如何被昵称文本视图替换。
|
|
请注意,即使在用户点按 DONE 按钮后,键盘仍处于可见状态。此行为是默认行为。
第 3 步:隐藏键盘
在此步骤中,您将添加代码以在用户点按 DONE 按钮后隐藏键盘。
- 在
MainActivity.kt中,在addNickname()函数的末尾,添加以下代码。如果您想详细了解此代码的工作原理,请参阅hideSoftInputFromWindow文档。
// Hide the keyboard.
val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)- 再次运行应用。请注意,点按完成后,键盘会隐藏起来。
|
|
用户点按完成按钮后,无法再更改昵称。在下一个任务中,您将使应用更具互动性,并添加一项功能,以便用户更新昵称。
在此任务中,您将向昵称文本视图添加点击监听器。点击监听器会隐藏昵称文本视图,显示编辑文本,并显示完成按钮。
第 1 步:添加点击监听器
- 在
MainActivity中,为昵称文本视图添加一个名为updateNickname(view: View)的点击监听器函数。
private fun updateNickname (view: View) {
}- 在
updateNickname函数内,获取对nickname_edit编辑文本的引用,并获取对完成 按钮的引用。为此,请使用findViewById()方法。
val editText = findViewById<EditText>(R.id.nickname_edit)
val doneButton = findViewById<Button>(R.id.done_button)- 在
updateNickname函数的末尾,添加代码以显示 EditText、显示完成按钮并隐藏 TextView。
editText.visibility = View.VISIBLE
doneButton.visibility = View.VISIBLE
view.visibility = View.GONE- 在
MainActivity.kt中,于onCreate()函数的末尾对nickname_text文本视图调用setOnClickListener。传入对点击监听器函数(即updateNickname())的引用。
findViewById<TextView>(R.id.nickname_text).setOnClickListener {
updateNickname(it)
}- 运行应用。输入昵称,点按完成按钮,然后点按昵称
TextView视图。昵称视图消失,编辑文本和完成按钮变为可见状态。
请注意,默认情况下,EditText 视图没有焦点,并且键盘不可见。用户很难发现昵称文本视图是可点击的。在下一个任务中,您将为昵称文本视图添加焦点和样式。
第 2 步:将焦点设置到 EditText 视图并显示键盘
- 在
updateNickname函数的末尾,将焦点设置到EditText视图。使用requestFocus()方法。
// Set the focus to the edit text.
editText.requestFocus()- 在
updateNickname函数的末尾,添加用于显示键盘的代码。
// Show the keyboard.
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(editText, 0)第 3 步:为昵称 TextView 视图添加背景颜色
- 将
nickname_text文本视图的背景颜色设置为@color/colorAccent,并添加@dimen/small_padding的底部内边距。这些更改将作为提示,向用户表明昵称文本视图可点击。
android:background="@color/colorAccent"
android:paddingBottom="@dimen/small_padding"- 运行最终应用。编辑文本具有焦点,昵称显示在编辑文本中,并且昵称文本视图已设置样式。
|
|
现在,去向朋友展示您的互动式 AboutMe 应用吧!
Android Studio 项目:AboutMeInteractive
- Android Studio 中的布局编辑器工具是一款可视化设计编辑器。您可以使用布局编辑器,将界面元素拖动到布局中来构建应用的布局。
EditText是一种界面元素,可让用户输入和修改文本。Button是一种界面元素,用户可以通过点按该元素来执行操作。按钮可以包含文字、图标,也可以同时包含文字和图标。
点击监听器
- 您可以向任何
View添加点击监听器,使其响应点按操作。 - 定义点击监听器的函数会接收被点击的
View。
您可以通过以下两种方式之一将点击监听器函数附加到 View:
- 在 XML 布局中,将
android:onClick属性添加到<View>元素中。 - 以编程方式,在相应的
Activity中使用setOnClickListener(View.OnClickListener)函数。
Udacity 课程:
Android 开发者文档:
此部分列出了在由讲师主导的课程中,学生学习此 Codelab 后可能需要完成的家庭作业。讲师自行决定是否执行以下操作:
- 根据需要布置作业。
- 告知学生如何提交家庭作业。
- 给家庭作业评分。
讲师可以酌情采纳这些建议,并且可以自由布置自己认为合适的任何其他家庭作业。
如果您是在自学此 Codelab,可随时通过这些家庭作业来检测您的知识掌握情况。
回答以下问题
问题 1
EditText 是谁的子类?
ViewLinearLayoutTextViewButton
问题 2
在视图上设置以下哪个 visibility 属性值时,会使视图隐藏且不会占用布局中的任何空间?
visibleInvisiblegonehide
问题 3
对于 EditText 视图,最好不要提供提示,因为提示会让输入字段太过杂乱。判断正误。
- True
- 错误
问题 4
在以下关于 Button 视图的表述中,哪一项是正确的?
Button视图是一个视图组。- 每个屏幕最多只能有三个
Button视图。 Button视图是可点击的,用户点击它后,附加的点击监听器会执行操作。Button是ImageView的扩展。
开始学习下一课:
如需本课程中其他 Codelab 的链接,请参阅“Android Kotlin 基础知识”Codelab 着陆页。


(居中)
(居中)

