Android Kotlin 基础知识 02.1:使用布局编辑器进行线性布局

此 Codelab 是“Android Kotlin 基础知识”课程的一部分。如果您按顺序学习这些 Codelab,您将会充分发掘此课程的价值。“Android Kotlin 基础知识”Codelab 着陆页列出了所有课程 Codelab。

您应当已掌握的内容

  • 使用 Kotlin 创建基本 Android 应用。
  • 在模拟器或设备上运行 Android 应用。
  • LinearLayout 的基础知识。
  • 创建使用 LinearLayoutTextView 的简单应用。

学习内容

  • 如何使用 ViewViewGroup
  • 如何使用 LinearLayout.Activity 中排列视图
  • 如何使用 ScrollView 显示可滚动的内容。
  • 如何更改 View 的公开范围。
  • 如何创建和使用字符串资源和尺寸资源。
  • 如何使用 Android Studio 的布局编辑器创建线性布局。

您将执行的操作

  • 创建 AboutMe 应用。
  • 向布局添加 TextView 以显示您的姓名。
  • 添加了 ImageView.
  • 添加 ScrollView 以显示可滚动的文本。

在 AboutMe 应用中,您可以展示关于自己的趣事,也可以为朋友、家人或宠物自定义应用。此应用显示了名称、完成按钮、星形图片和一些可滚动的文本。

在此任务中,您将创建 AboutMe Android Studio 项目。

  1. 打开 Android Studio(如果尚未打开)。
  2. 如果 Android Studio 中已打开项目,请依次选择 File > New > New Project


  3. 如果尚未打开项目,请在 Welcome to Android Studio 对话框中选择 + Start a new Android Studio project


  4. Create New Project 对话框的 Phone and Tablet 标签页中,选择 Empty Activity 模板。点击下一步


  5. 在下一个创建新项目对话框中,设置以下参数,然后点击完成

属性

应用名称

AboutMe

公司名称 android

com.android.example.AboutMe (或您自己的网域)

保存位置

保留默认位置,或将其更改为您首选的目录。

语言

Kotlin

最低 API 级别

API 19:Android 4.4 (KitKat)

此项目将支持免安装应用

请勿选中此复选框。

使用 AndroidX 制品

选中此复选框。

Android Studio 需要片刻时间来生成项目文件。

  1. 运行您的应用。您会在空白屏幕上看到字符串“Hello World”。

Empty Activity 模板会创建一个空的 activity,即 Mainactivity.kt。该模板还会创建一个名为 activity_main.xml 的布局文件。布局文件的根 ViewGroupConstraintLayout,并且其内容为单个 TextView

在此任务中,您将生成的根 ViewGroup 更改为 LinearLayout。您还可以垂直排列界面元素。

查看组

ViewGroup 是一种可以包含视图(即其他视图和视图组)的视图。构成布局的视图以视图层次结构的形式进行组织,其中视图组是根。

LinearLayout 视图组中,界面元素以水平或垂直方式排列。

更改根布局,使其使用 LinearLayout 视图组:

  1. 选择 Project > Android 窗格。在 app/res/layout 文件夹中,打开 activity_main.xml 文件。
  2. 选择 Text 标签页,然后将根视图组从 ConstraintLayout 更改为 LinearLayout
  3. 移除 TextView。在 LinearLayout 元素中,添加 android:orientation 属性并将其设置为 vertical

Before:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">

   <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Hello World!"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

之后:

<LinearLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical"
       tools:context=".MainActivity">

</LinearLayout>

布局编辑器是 Android Studio 中的一种可视化设计工具。您可以使用布局编辑器将界面元素拖动到设计编辑器中,而不是手动编写 XML 代码来构建应用的布局。

如需查看布局编辑器,请点击 Design 标签页。以下屏幕截图显示了布局编辑器的各个部分。

设计编辑器:在设计视图和/或蓝图视图中直观地显示屏幕布局。设计编辑器是布局编辑器的主要部分。

工具栏: 提供了一些按钮,用于在设计编辑器中配置布局的外观,以及更改某些布局属性。例如,如需更改设计编辑器中布局的显示方式,请使用选择设计界面 下拉菜单:

  • 使用 Design 可查看布局的实际预览效果。
  • 选择 Blueprint 可仅查看每个视图的轮廓。
  • 使用 Design + Blueprint 可并排查看这两个显示屏。

Palette:提供您可以拖到布局或 Component Tree 窗格中的视图和视图组列表。

Attributes:显示当前所选视图或视图组的属性。如需在完整属性列表和常用属性之间切换,请使用窗格顶部的 图标。

Component Tree: 以视图树的形式显示布局层次结构。当您有在设计编辑器中无法选择的小型、隐藏或重叠的视图时,Component Tree 会非常有用。

第 1 步:添加 TextView

  1. 打开 res/layout/activity_main.xml 文件(如果尚未打开)。
  2. 切换到文本标签页 ,然后检查代码。该代码将 LinearLayout 作为其根视图组。(视图组是包含其他视图的视图。)

    LinearLayout 具有必需的属性 layout_heightlayout_widthorientation,默认值为 vertical
  3. 切换到 Design 标签页以打开布局编辑器。
  1. 将文本视图从 Palette 窗格拖到设计编辑器中。


  2. 请注意 Component Tree 窗格。新文本视图将作为父视图组(即 LinearLayout)的子元素放置。

  3. 打开属性窗格(如果尚未打开)。(如需打开该窗格,请在设计编辑器中双击新添加的 TextView。)
  4. 属性窗格中设置以下属性:

属性

ID

name_text

text

将其设置为您的姓名。(其中一个文本字段显示扳手图标,表示它适用于 tools 命名空间。没有扳手的那个是 android 命名空间(这是您需要的 text 字段)。

textAppearance > textSize

20sp

textAppearance > textColor

@android:color/black

textAppearance > textAlignment

中心

第 2 步:创建字符串资源

Component Tree 中,您会看到 TextView, 旁边有一个警告图标 。如需查看警告文本,请点击或指向相应图标,如下面的屏幕截图所示。

如需解决此警告,请创建字符串资源:

  1. 属性窗格中,点击您设置为自己名称的文本属性旁边的三点状图标。系统会打开资源编辑器。


  2. Resources 对话框中,依次选择 Add new resource > New string Value
  3. 新建字符串值资源对话框中,将资源名称字段设置为 name。将资源值字段设置为您自己的名称。点击确定。请注意,警告已消失。


  4. 打开 res/values/strings.xml 文件,然后查找名为 name 的新创建的字符串资源。
<string name="name">Aleks Haecky</string>

第 3 步:创建维度资源

您刚刚使用资源编辑器添加了资源。您还可以在 XML 代码编辑器中提取资源以创建新资源:

  1. activity_main.xml 文件中,切换到 Text 标签页。
  2. textSize 行中,点击相应数字 (20sp),然后输入 Alt+Enter(在 Mac 上,输入 Option+Enter)。从弹出式菜单中选择 Extract dimension resource
  3. Extract Resource 对话框中,在资源名称字段中输入 text_size。点击确定


  4. 打开 res/values/dimens.xml 文件可查看生成的以下代码:
<dimen name="text_size">20sp</dimen>
  1. 打开 MainActivity.kt 文件,然后在 onCreate() 函数的末尾查找以下代码:
setContentView(R.layout.activity_main)

setContentView() 函数将布局文件与 Activity 相关联。指定的布局资源文件为 R.layout.activity_main

  • R 是对资源的引用。这是一个自动生成的类,其中包含应用中所有资源的定义。
  • layout.activity_main 表示相应资源是名为 activity_main 的布局。
  1. 运行应用。系统会显示一个包含您姓名的 TextView

当您查看应用界面时,您的姓名会紧贴界面顶部,因此现在您需要添加内边距和外边距。

内边距与外边距

内边距是指视图或元素边界内的空间。它是视图边缘与视图内容之间的空间,如下图所示。

视图的大小包括其内边距。以下是常用的边衬区属性:

边距是指在视图边框外部添加的空间。它是从视图边缘到其父视图的间距,如上图所示。以下是常用的边距属性:

第 1 步:添加内边距

如需在您的姓名与 name 文本视图的上边缘之间添加间距,请添加顶部边衬区。

  1. Design 标签页中打开 activity_main.xml 文件。
  2. Component Tree 或设计编辑器中,点击文本视图以打开其 Attributes 窗格。
  3. 属性窗格顶部,点击双箭头图标 即可查看所有可用的属性。
  4. 搜索 Padding,展开它,然后点击 top 属性旁边的三点状图标 ...。系统会显示 Resources 对话框。
  5. Resources 对话框中,依次选择 Add new resource > New dimen Value
  6. 新维度值资源对话框中,创建一个名为 small_padding 的新 dimen 资源,其值为 8dp

    dp 缩写表示密度无关。如果您希望界面元素在密度不同的屏幕上看起来大小相同,请使用 dp 作为度量单位。不过,在指定文本大小时,请务必使用 sp(可缩放像素)。
  7. 点击确定

第 2 步:添加边距

如需将 name 文本视图移离父元素的边缘,请添加上边距。

  1. 属性窗格中,搜索“边距”,找到 Layout_Margin
  2. 展开 Layout_Margin,然后点击 top 属性旁边的三点状图标 ...
  3. 创建一个名为 layout_margin 的新 dimen 资源,并将其设为 16dp。点击 OK

第 3 步:添加字体

为了让 name 文本视图看起来更好,请使用 Android Roboto 字体。此字体是支持库的一部分,您可将该字体添加为资源。

  1. 属性窗格中,搜索“fontFamily”。
  2. fontFamily 字段中,点击下拉箭头滚动到列表底部,然后选择 More Fonts
  3. Resources 对话框中,搜索 rob 并选择 Roboto。在预览列表中,选择常规
  4. 选择 将字体添加到项目单选按钮。
  5. 点击确定

res 文件夹现在包含一个 font 文件夹,其中包含一个 roboto.ttf 字体文件。@font/roboto 属性已添加到您的 TextView

第 4 步:提取风格

样式是一组属性,用于指定视图的外观和格式。样式可以包含字体颜色、字号、背景颜色、内边距、边距和其他常见属性。

您可以将 name 文本视图的格式提取到样式中,并针对应用中的任意数量的视图重复使用该样式。如果您有多个视图,重复使用样式可让应用具有一致的外观。使用样式还可以将这些通用属性集中在一个位置。

  1. 组件树中右键点击 TextView,然后依次选择 Refactor > Extract Style
  2. 提取 Android 样式对话框中,清除 layout_width 复选框、layout_height 复选框和 textAlignment 复选框。这些属性通常因视图而异,因此您不希望它们成为样式的一部分。
  3. 样式名称字段中,输入 NameStyle
  4. 点击确定


  5. 样式也是一种资源,因此样式会保存在 res/values/ 文件夹中的 styles.xml 文件中。打开 styles.xml 并检查为 NameStyle 样式生成的代码,该代码应类似于以下内容:
<style name="NameStyle">
   <item name="android:layout_marginTop">@dimen/layout_margin</item>
   <item name="android:fontFamily">@font/roboto</item>
   <item name="android:paddingTop">@dimen/small_padding</item>
   <item name="android:textColor">@android:color/black</item>
   <item name="android:textSize">@dimen/text_size</item>
</style>
  1. 打开 activity_main.xml 并切换到 Text 标签页。请注意,生成的样式在文本视图中以 style="@style/NameStyle" 的形式使用。
  2. 运行应用,并注意字体和 TextView 周围的内边距发生了变化。

大多数实际的 Android 应用都包含视图的组合,用于显示图片、显示文字以及接受用户以文字或点击事件形式提供的输入。在此任务中,您将添加一个用于显示图片的视图。

ImageView 是用于显示图片资源的视图。例如,ImageView 可以显示 Bitmap 资源(例如 PNG、JPG、GIF 或 WebP 文件),也可以显示 Drawable 资源(例如矢量绘图)。

Android 附带了一些图片资源,例如示例图标、头像和背景。您将向应用添加其中一种资源。

  1. 设计标签页中显示布局文件,然后将 Palette 窗格中的 ImageView 拖动到 Component Tree 中的 name_text 下方。系统会打开资源 对话框。
  2. 选择 Drawable(如果尚未选择)。
  3. 展开 android,滚动并选择 btn_star_big_on。是黄色星标
  4. 点击确定



    星标图片会添加到您姓名下方的布局中。由于您使用的是垂直 LinearLayout,因此添加的视图会垂直对齐。

  5. 切换到文本标签页,然后查看生成的 ImageView 代码。宽度设置为 match_parent,因此视图的宽度将与其父元素的宽度相同。高度设置为 wrap_content,因此视图将与内容一样高。ImageView 引用 btn_star_big_on 可绘制对象。
<ImageView
   android:id="@+id/imageView"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   app:srcCompat="@android:drawable/btn_star_big_on" />
  1. 如需重命名 ImageViewid,请右键点击 "@+id/imageView",然后依次选择 Refactor > Rename
  2. 重命名对话框中,将 id 设置为 @+id/star_image。点击 Refactor


  1. 设计标签页的组件树中,点击 star_image 旁边的警告图标 。此警告是针对缺失的 contentDescription屏幕阅读器会使用该属性向用户描述图片。
  2. 属性窗格中,点击 contentDescription 属性旁边的三点状图标 ...。系统随即会打开资源对话框。
  3. Resources 对话框中,依次选择 Add new resource > New string Value。将资源名称字段设置为 yellow_star,并将资源值字段设置为 Yellow star。点击确定
  4. 使用属性窗格为 yellow_star 添加 16dp(即 @dimen/layout_margin)的上边距,以将星标图片与名称分开。
  5. 运行应用。您的姓名和星形图片会显示在应用界面中。

ScrollView 是一个视图组,允许滚动其中的视图层次结构。滚动视图只能包含一个其他视图或视图组(作为子视图)。子视图通常是 LinearLayout。在 LinearLayout 中,您可以添加其他视图。

下图显示了一个 ScrollView 的示例,该 ScrollView 包含一个 LinearLayout,而该 LinearLayout 又包含多个其他视图。

此滚动视图包含一个线性布局,该布局包含多个其他视图。

在此任务中,您将添加一个 ScrollView,以便用户滚动显示简短个人简介的文本视图。如果您只希望一个视图可滚动,则可以直接将该视图放入 ScrollView 中,这正是您在此任务中要做的。

此 ScrollView 包含一个 TextView

第 1 步:添加包含 TextView 的 ScrollView

  1. Design 标签页中打开 activity_main.xml 文件。
  2. 将滚动视图拖到设计编辑器或 Component Tree 中,从而将其拖到布局中。将滚动视图放在星形图片下方。
  3. 切换到 Text 标签页以检查生成的代码。
// Auto generated code
<ScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical" />
</ScrollView>

ScrollView 的高度和宽度与父元素一致。当 name_text 文本视图和 star_image 图片视图已使用足够的垂直空间来显示其内容后,Android 系统会布置 ScrollView 以填充屏幕上剩余的可用空间。

  1. ScrollView 添加 id,并将其命名为 bio_scroll。向 ScrollView 添加 id 可为 Android 系统提供视图句柄,以便在用户旋转设备时,系统能够保留滚动位置。
  2. ScrollView 内,移除 LinearLayout 代码,因为您的应用将只有一个可滚动的视图,即 TextView
  3. TextViewPalette 拖动到 Component Tree。将 TextView 放在 bio_scroll 下面,作为 bio_scroll 的子元素。

  4. 将新文本视图的 id 设置为 bio_text
  5. 接下来,您将为新的文本视图添加样式。在属性窗格中,点击 style 属性旁边的三个点 ...,打开资源对话框。
  6. 资源对话框中,搜索 NameStyle。从列表中选择 NameStyle,然后点击确定。文本视图现在使用您在之前的任务中创建的 NameStyle 样式。

第 2 步:将个人简介添加到新的 TextView

  1. 打开 strings.xml,创建一个名为 bio 的字符串资源,并在其中放入一些关于您自己或您想说的任何内容的较长文本。

以下是个人简介示例:

<string name="bio">Hi, my name is Aleks.
\n\nI love fish.
\n\nThe kind that is alive and swims around in an aquarium or river, or a lake, and definitely the ocean.
\nFun fact is that I have several aquariums and also a river.
\n\nI like eating fish, too. Raw fish. Grilled fish. Smoked fish. Poached fish - not so much.
\nAnd sometimes I even go fishing.
\nAnd even less sometimes, I actually catch something.
\n\nOnce, when I was camping in Canada, and very hungry, I even caught a large salmon with my hands.
\n\nI\'ll be happy to teach you how to make your own aquarium.
\nYou should ask someone else about fishing, though.\n\n</string>
  1. bio_text 文本视图中,将 text 属性的值设置为包含个人简介的 bio 字符串资源。
  2. 为了让 bio_text 文本更易于阅读,请在各行之间添加间距。使用 lineSpacingMultiplier 属性,并将其值设为 1.2



    请注意,在设计编辑器中,bio 文本一直延伸到屏幕的侧边缘。如需解决此问题,您可以向根 LinearLayout 添加左侧、起始、右侧和结束内边距属性。您无需添加底部内边距,因为紧贴底部的文字会向用户表明文字可以滚动。
  3. 为根 LinearLayout 添加 16dp 的起始和结束内边距。
  4. 切换到 Text 标签页,提取维度资源,并将其命名为 layout_padding

  1. 运行应用并滚动浏览文本。

恭喜!

您已从头开始创建了一个完整的应用,而且效果非常棒!

Android Studio 项目:AboutMe

ScrollView 内,在 TextView 上方添加 ImageView。当您运行应用时,此图片会随着文字向上滚动而滚动出视图,这与星形不同。

提示:滚动视图只能有一个子视图。您必须将两个可滚动视图(ImageViewTextView)封装到 LinearLayout 中。

  • ViewGroup 是一种可以包含其他视图的视图。LinearLayoutScrollView 是视图组。
  • LinearLayout 是一个视图组,用于水平或垂直排列其子视图。
  • 当您需要在屏幕上显示内容(例如长文本或一组图片)时,请使用 ScrollView。滚动视图只能包含一个子视图。如果您想滚动多个视图,请向 ScrollView 添加 ViewGroup(例如 LinearLayout),并将要滚动的视图放在该 ViewGroup 内。
  • 布局编辑器是 Android Studio 中的一个可视化设计编辑器。您可以使用布局编辑器,将界面元素拖动到布局中,从而构建应用的布局。
  • 样式是一个属性集合,用于指定视图的外观。例如,样式可以指定字体颜色、字号、背景颜色、内边距和外边距。
  • 您可以将视图的所有格式提取并收集到样式中。为了让应用具有一致的外观,请为其他视图重复使用该样式。

Udacity 课程:

Android 开发者文档:

此部分列出了在由讲师主导的课程中,学生学习此 Codelab 后可能需要完成的家庭作业。讲师自行决定是否执行以下操作:

  • 根据需要布置作业。
  • 告知学生如何提交家庭作业。
  • 给家庭作业评分。

讲师可以酌情采纳这些建议,并且可以自由布置自己认为合适的任何其他家庭作业。

如果您是在自学此 Codelab,可随时通过这些家庭作业来检测您的知识掌握情况。

回答以下问题

问题 1

以下哪一项是视图组?

EditText

LinearLayout

TextView

Button

问题 2

下列视图层次结构中哪一个是无效的?

LinearLayout > TextViewTextViewImageView

ScrollView > LinearLayout > TextViewButtonButtonScrollView > TextView

TextView > TextViewImageViewScrollView

问题 3

样式是在 styles.xml 中定义的资源。您可以使用样式定义视图的颜色、字体、文字大小和许多其他特性。判断正误。

▢ 正确

▢ 错误

问题 4

ScrollView 是一种视图组,可包含任意数量的视图或视图组作为其子项。判断正误。

▢ 正确

▢ 错误

问题 5

可以使用哪个界面元素在应用中显示图片?

TextView

ImageView

Button

ScrollView

开始学习下一课:2.2:添加用户交互

如需本课程中其他 Codelab 的链接,请参阅“Android Kotlin 基础知识”Codelab 着陆页