此 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
是谁的子类?
View
LinearLayout
TextView
Button
问题 2
在视图上设置以下哪个 visibility
属性值时,会使视图隐藏且不会占用布局中的任何空间?
visible
Invisible
gone
hide
问题 3
对于 EditText
视图,最好不要提供提示,因为提示会让输入字段太过杂乱。判断正误。
- True
- 错误
问题 4
在以下关于 Button
视图的表述中,哪一项是正确的?
Button
视图是一个视图组。- 每个屏幕最多只能有三个
Button
视图。 Button
视图是可点击的,用户点击它后,附加的点击监听器会执行操作。Button
是ImageView
的扩展。
开始学习下一课:
如需本课程中其他 Codelab 的链接,请参阅“Android Kotlin 基础知识”Codelab 着陆页。