初探 Java、XML 与 UI 设计器

1. Java 代码概述

在 Android 项目中,代码通过引用 Android Studio 创建项目时自动生成的资源文件来设置应用的外观和布局。虽然代码中存在一些复杂的语法,但我们不需要一开始就深入了解其具体功能,而是逐步积累对代码的认识,以便在不先学习数百页 Java 理论的情况下,快速开始学习 Java 和 Android 开发。随着学习的深入,所有代码都会变得清晰易懂。

2. 查看主布局文件

在众多的 .xml 文件中,我们先从决定应用大部分外观的 content_hello_world.xml 文件开始。操作步骤如下:
1. 点击 HelloWorldActivity.java 标签旁边的 content_hello_world.xml 标签。
2. 在右侧主窗口中,你将看到应用的设计视图,大部分应用设计工作将在此视图中完成,但了解背后的代码也很重要。
3. 点击设计视图左下角的“Text”标签,查看构成布局的 XML 代码。

3. XML 代码中的 UI 元素
3.1 UI 布局元素

XML 代码的第一部分是 <...ConstraintLayout...> ,它是一个用于包裹其他 UI 部分的 UI 元素。添加新元素时,以 < 开头,后面是元素名称。随后的代码定义了该元素的属性,如 layout_width layout_height showIn 等,这些属性决定了 ConstraintLayout 在用户屏幕上的显示方式。属性定义以第一个 > 结束,而 </...ConstraintLayout> 标记了该元素的结束。元素属性结束的 > </...ConstraintLayout> 之间的内容被视为该元素的子元素。

3.2 UI 文本元素

截图中位置 3 开始的 UI 元素是 TextView ,同样以 < 和元素名称开头。 TextView 有多个属性,其中 text 属性设置为 "Hello world!" ,这就是应用显示给用户的文本。 layout_width layout_height 属性都设置为 "wrap_content" ,表示 TextView 会根据内容自动调整大小。最后一个属性是 id ,在后续改进应用时,我们将看到如何使用这个属性。当元素没有子元素时,以 /> 结束;当元素有子元素时,以 </...元素名称> 结束。

4. 向主布局文件添加按钮

我们将通过两种方式添加按钮:使用可视化设计器和直接编辑 XML 代码。

4.1 使用可视化设计器添加按钮

操作步骤如下:
1. 点击 XML 代码下方的“Design”标签,切换到设计视图。
2. 布局左侧的“Palette”窗口分为两部分,左侧列表显示 UI 元素类别,右侧显示当前选中类别的所有可用 UI 元素。确保选择“Common”类别。
3. 左键按住“Button”小部件,将其拖到布局的顶部中央附近。如果对按钮位置不满意,可以左键点击选择按钮,然后按键盘上的“Delete”键删除,重复上述步骤直到满意为止。
4. 此时可以在模拟器或真机上运行应用,按钮会显示出来,点击按钮会有简单的动画效果。

4.2 编辑按钮属性

操作步骤如下:
1. 左键点击按钮,确保其被选中。
2. 找到编辑窗口右侧的“Attributes”窗口,点击“View all attributes”链接,查看按钮的所有属性。
3. 滚动“Attributes”窗口,找到 onClick 属性并左键点击选择编辑。
4. 在 onClick 属性的编辑框中输入 topClick ,并按键盘上的“Enter”键。这里要注意大小写,使用小写的 t 和大写的 C

我们为按钮点击时要调用的 Java 方法命名为 topClick ,但该方法目前还不存在。此时运行应用,点击按钮会导致应用崩溃并报错。

5. 查看新按钮的 XML 代码

在添加最后一个按钮之前,点击编辑器下方的“Text”标签,切换回查看构成 UI 的 XML 代码。可以看到新添加的按钮代码块,具有以下特点:
- 代码以 <Button 开头,以 /> 结尾。
- 包含一系列定义按钮的属性,如 layoutWidth layoutHeight
- 包含我们添加的 onClick 属性,值为 "topClick" ,该值下方有红色下划线,表示存在错误。
- 按钮代码的开始和结束都包含在 ConstraintLayout 内。

将鼠标悬停在红色下划线的 topClick 上,可以看到错误详情,即 Android Studio 期望在代码中实现 topClick 方法。

下面是操作流程的 mermaid 流程图:

graph TD;
    A[开始] --> B[查看 Java 代码];
    B --> C[查看主布局文件];
    C --> D[切换到设计视图];
    D --> E[添加按钮];
    E --> F[编辑按钮属性];
    F --> G[查看按钮 XML 代码];
6. 通过编辑 XML 代码添加按钮

为了加深对 UI 设计器和底层 XML 代码关系的理解,我们将仅使用 XML 代码添加另一个按钮。操作步骤如下:
1. 左键点击以 <Button 开头的按钮代码之前的位置,代码的开始和结束会有轻微高亮显示。
2. 左键点击并拖动,选择整个按钮代码,包括高亮的开始和结束部分。
3. 按下 CTRL + C 组合键复制代码。
4. 将光标放在现有按钮代码下方,按几次“Enter”键留出空白行。
5. 按下 Ctrl + V 组合键粘贴按钮代码。

此时会出现两个问题:
- 两个按钮代码块中的 id 属性都有红色下划线,因为它们的 id 属性相同,而 id 属性应该用于区分不同的 UI 元素。
- 运行应用时,只能看到一个按钮,且按钮位置不符合预期,因为我们没有明确设置它们的位置,默认显示在左上角。

7. 为按钮设置唯一的 id 属性

为了解决 id 属性相同的问题,我们将两个按钮的 id 属性都进行修改。操作步骤如下:
1. 在第一个按钮的代码中,找到 android:id="@+id/button" 这一行,将其改为 android:id="@+id/buttonTop" 。注意 button 中的 b 为小写, Top 中的 T 为大写。
2. 在第二个按钮的代码中,找到 android:id="@+id/button" 这一行,将其改为 android:id="@+id/buttonBottom"

修改后, id 属性行的错误消失。

8. 在布局中定位两个按钮

两个按钮重叠的原因是它们位于同一位置,第二个按钮完全覆盖了第一个按钮。为了解决这个问题,我们将通过以下步骤让 Android Studio 自动解决:
1. 在第二个按钮的代码中,找到 tools:layout_editor_absoluteY="30dp" /> 这一行,将其改为 tools:layout_editor_absoluteY="100dp" /> 。这只会在设计时将第二个按钮向下移动一点。
2. 切换到设计视图,找到“ Infer Constraints”按钮并点击。Android Studio 会自动编辑 XML 代码,具体变化如下:
- 从两个按钮的代码末尾移除了 tools:layout_editor_absoluteX="147dp" tools:layout_editor_absoluteY="30dp" /> 这两行代码,这两行代码用于水平和垂直定位按钮。
- 为第一个按钮添加了四行代码,为第二个按钮添加了三行代码。例如,在第一个按钮开始附近添加了 android:layout_marginTop="30dp" ,表示按钮顶部有 30 的边距;在第一个按钮末尾添加了 app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> ,这些新属性的值都为 "parent" ,使第一个按钮相对于父 UI 元素(即 ConstraintLayout )进行定位。

下面是定位按钮操作的步骤列表:
| 步骤 | 操作 |
| ---- | ---- |
| 1 | 修改第二个按钮的 tools:layout_editor_absoluteY 属性 |
| 2 | 切换到设计视图 |
| 3 | 点击“ Infer Constraints”按钮 |
| 4 | 查看 XML 代码的变化 |

通过以上步骤,我们完成了在 Android 应用中添加和定位按钮的操作,同时也深入了解了 Java、XML 代码与 UI 设计器之间的关系。在后续的学习中,我们将继续完善应用,实现更多功能。

初探 Java、XML 与 UI 设计器

9. 总结与后续展望

通过前面的操作,我们已经成功地在 Android 应用中添加了按钮,并对其进行了属性编辑和位置调整。这一系列操作让我们对 Java、XML 代码与 UI 设计器之间的协作有了更深入的理解。

在这个过程中,我们学习了如何使用可视化设计器和直接编辑 XML 代码两种方式来添加 UI 元素,以及如何通过属性设置来定制这些元素的行为和外观。例如,我们为按钮设置了 onClick 属性,指定了按钮点击时要调用的 Java 方法;通过修改 id 属性,确保了每个 UI 元素的唯一性;利用 ConstraintLayout 和相关约束属性,实现了按钮在布局中的相对定位。

接下来,我们需要实现之前为按钮点击事件命名的 topClick 方法。这将涉及到 Java 代码的编写,通过 Java 代码来处理按钮点击事件,实现具体的功能逻辑。在后续的学习中,我们还将进一步探索如何使用 Java 代码来编辑和操作 UI 元素的属性,实现更复杂的交互效果。

下面是一个简单的 mermaid 流程图,展示了我们后续需要完成的步骤:

graph TD;
    A[完成按钮添加与定位] --> B[实现 topClick 方法];
    B --> C[使用 Java 代码操作 UI 属性];
    C --> D[实现更复杂交互效果];
10. 常见问题及解决方法

在添加和定位按钮的过程中,我们可能会遇到一些常见问题,下面为大家总结了这些问题及相应的解决方法:

问题 现象 原因 解决方法
id 属性冲突 代码中 id 属性下方出现红色下划线 多个 UI 元素使用了相同的 id 属性 为每个 UI 元素设置唯一的 id 属性
按钮重叠 运行应用时只能看到一个按钮 未明确设置按钮位置,导致按钮默认重叠 通过修改 tools:layout_editor_absoluteY 属性和使用“ Infer Constraints”按钮来调整按钮位置
按钮点击崩溃 点击按钮时应用崩溃并报错 为按钮设置的 onClick 方法在代码中未实现 编写相应的 Java 方法来处理按钮点击事件
11. 拓展知识:UI 设计的灵活性

在 Android 开发中,UI 设计具有很高的灵活性。我们在定位按钮时可能会觉得设计工具的某些操作有些反直觉,但这正是为了实现这种灵活性。例如,我们可以在设计时和应用运行时为 UI 元素设置不同的位置,还可以选择多种不同的布局方案来满足不同的设计需求。

以下是一些常见的布局方案及其特点:

布局方案 特点 适用场景
ConstraintLayout 通过约束关系来定位和布局 UI 元素,灵活性高 复杂布局,需要元素之间有精确的相对位置关系
LinearLayout 线性排列子元素,可以是水平或垂直方向 简单的线性布局,如菜单、列表等
RelativeLayout 根据子元素之间的相对位置进行布局 元素之间有相对位置关系,但不需要复杂约束的布局
FrameLayout 所有子元素都堆叠在左上角,后添加的元素会覆盖前面的元素 简单的重叠布局,如图片叠加效果
12. 代码示例:实现 topClick 方法

为了让按钮点击事件正常工作,我们需要实现 topClick 方法。以下是一个简单的 Java 代码示例:

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class HelloWorldActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_world);
    }

    public void topClick(View view) {
        Toast.makeText(this, "按钮被点击了!", Toast.LENGTH_SHORT).show();
    }
}

在这个示例中,我们在 HelloWorldActivity 类中定义了 topClick 方法。当按钮被点击时,该方法会被调用,通过 Toast 显示一个简单的提示信息。

13. 实践建议

为了更好地掌握 Java、XML 与 UI 设计器的使用,建议大家多进行实践操作。可以尝试以下练习:
1. 添加更多的 UI 元素,如文本框、图片等,并对它们进行属性设置和布局调整。
2. 修改按钮的 onClick 方法,实现不同的功能,如跳转到其他页面、播放声音等。
3. 尝试使用不同的布局方案,比较它们的优缺点,选择最适合自己项目的布局方式。

通过不断地实践和探索,相信大家能够熟练掌握 Android 应用开发中的 UI 设计技巧,开发出更加美观、实用的应用程序。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐