当前位置: 首页 > news >正文

HarmonyOS学习第12天:解锁表格布局的奥秘

表格布局初相识

不知不觉,我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里,我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能,比如组件的基本使用、布局的初步搭建等,这些知识就像一块块基石,为我们构建强大应用程序奠定了基础。今天,我们将迎来一个新的重要布局方式 —— 表格布局(TableLayout)。

在许多应用场景中,我们常常需要以表格形式展示数据,比如财务报表展示收入支出数据、课程表呈现课程安排、员工信息表罗列员工的各项信息等。在这些情况下,表格布局就显得尤为重要。它能够让数据以一种整齐、结构化的方式呈现,方便用户快速浏览和对比信息 ,极大地提升了数据展示的效率与用户体验。接下来,就让我们深入了解表格布局的使用方式。

搭建表格框架

(一)创建基础表格

在 HarmonyOS 中,使用<TableLayout>标签来创建表格布局。其基本语法如下:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent">

    <!-- 这里放置表格的内容,如行、列及组件 -->

</TableLayout>

在上述代码中,xmlns:ohos是命名空间声明,用于指定 HarmonyOS 的资源标识符。ohos:heightohos:width属性分别设置表格布局的高度和宽度,这里设置为match_parent,表示表格将填充父容器的整个空间。

接下来,我们通过一个简单的示例来展示如何创建一个包含文本组件的表格。假设我们要创建一个简单的 2x2 表格,每个单元格中放置一个文本:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent">

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="1"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="2"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="3"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="4"

        ohos:text_size="20fp" />

</TableLayout>

在这个示例中,我们在<TableLayout>中添加了四个<Text>组件。每个<Text>组件设置了高度和宽度为wrap_content,表示根据文本内容自适应大小,同时设置了文本内容和字体大小。运行该代码,即可看到一个简单的表格,其中文本按顺序排列在表格的单元格中 。

(二)设置行列属性

<TableLayout>中,可以通过ohos:row_countohos:column_count属性来设置表格的行数和列数。例如,要创建一个 3 行 4 列的表格,可以这样设置:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="3"

    ohos:column_count="4">

    <!-- 这里放置表格的内容,如行、列及组件 -->

</TableLayout>

当设置了行数和列数后,放置在<TableLayout>中的组件会按照行列顺序依次填充单元格。如果组件数量小于单元格数量,多余的单元格将为空;如果组件数量大于单元格数量,多余的组件将根据布局规则进行显示 。

下面我们通过不同的代码示例来展示设置不同行列数的效果。

示例一:2 行 2 列的表格

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="2"

    ohos:column_count="2">

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="A"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="B"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="C"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="D"

        ohos:text_size="20fp" />

</TableLayout>

在这个示例中,四个<Text>组件会依次填充 2 行 2 列的四个单元格,形成一个规整的表格。

示例二:1 行 5 列的表格

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="1"

    ohos:column_count="5">

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="1"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="2"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="3"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="4"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="5"

        ohos:text_size="20fp" />

</TableLayout>

此示例中,五个<Text>组件会排列在同一行的五个单元格中,形成一个单行多列的表格效果。通过这些示例,我们可以清晰地看到ohos:row_countohos:column_count属性对表格布局的影响,根据实际需求灵活设置行列数,为后续在表格中放置各种组件奠定基础。

填充表格内容

(一)添加行与列

<TableLayout>中,通过直接添加组件来形成行和列的结构。每个组件默认占据一个单元格,组件会按照添加的顺序依次填充表格的单元格。例如,我们要创建一个简单的 3x3 的表格,每个单元格放置一个按钮,代码如下:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="3"

    ohos:column_count="3">

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮1"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮2"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮3"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮4"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮5"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮6"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮7"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮8"

        ohos:text_size="18fp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮9"

        ohos:text_size="18fp" />

</TableLayout>

在上述代码中,我们在<TableLayout>标签内依次添加了九个<Button>组件 。由于设置了ohos:row_count="3"ohos:column_count="3",这些按钮会按照 3 行 3 列的方式排列在表格中。运行代码后,即可看到一个整齐的 3x3 按钮表格。

如果需要在表格中添加不同类型的组件,比如文本、图片、输入框等,也可以按照同样的方式进行添加。例如,创建一个包含文本和图片的表格:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="2"

    ohos:column_count="2">

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="姓名"

        ohos:text_size="20fp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="年龄"

        ohos:text_size="20fp" />

    <Image

        ohos:height="100vp"

        ohos:width="100vp"

        ohos:src_element="$media:icon" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="25"

        ohos:text_size="20fp" />

</TableLayout>

在这个示例中,第一行的两个单元格分别放置了 “姓名” 和 “年龄” 文本,第二行的第一个单元格放置了一张图片(通过ohos:src_element指定图片资源),第二个单元格放置了年龄信息的文本。这样就创建了一个简单的数据展示表格,通过这种方式,可以根据实际需求灵活组合各种组件,构建出丰富多样的表格布局。

(二)组件布局技巧

在表格布局中,还可以通过一些属性来控制组件在单元格内的布局,使表格更加美观和符合需求。常见的属性有ohos:layout_alignmentohos:paddingohos:margin等。

ohos:layout_alignment属性用于设置组件在单元格内的对齐方式,它有多个取值,如left(左对齐)、right(右对齐)、center(居中对齐)、top(顶部对齐)、bottom(底部对齐)等。例如,将按钮在单元格内居中对齐:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="2"

    ohos:column_count="2">

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮1"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮2"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮3"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮4"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

</TableLayout>

在上述代码中,每个按钮都设置了ohos:layout_alignment="center",这样按钮在各自所在的单元格内会水平和垂直方向都居中显示,使表格看起来更加整齐美观。

ohos:padding属性用于设置组件内部的内边距,即组件内容与组件边框之间的距离。通过设置ohos:padding,可以调整组件内文本或图片与组件边缘的间距,使组件内容显示更加舒适。例如:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="1"

    ohos:column_count="2">

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="文本1"

        ohos:text_size="20fp"

        ohos:padding="10vp" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="文本2"

        ohos:text_size="20fp"

        ohos:padding="15vp" />

</TableLayout>

在这个例子中,第一个文本组件设置了ohos:padding="10vp",表示其内容与边框四周的距离为 10vp;第二个文本组件设置了ohos:padding="15vp",内边距更大,这样可以直观地看到内边距对组件内容显示的影响,通过合理设置内边距,可以优化组件在单元格内的展示效果。

ohos:margin属性用于设置组件的外边距,即组件与其他组件之间的距离。它可以控制组件在表格中的相对位置,使表格布局更加灵活。例如:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="2"

    ohos:column_count="2">

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮A"

        ohos:text_size="18fp"

        ohos:margin="5vp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮B"

        ohos:text_size="18fp"

        ohos:margin="10vp 5vp 10vp 5vp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮C"

        ohos:text_size="18fp"

        ohos:margin="5vp 10vp" />

    <Button

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="按钮D"

        ohos:text_size="18fp" />

</TableLayout>

在这段代码中,第一个按钮设置了ohos:margin="5vp",表示其与四周其他组件的距离均为 5vp;第二个按钮设置了ohos:margin="10vp 5vp 10vp 5vp",分别表示上、右、下、左的外边距,即上和下外边距为 10vp,左和右外边距为 5vp;第三个按钮设置了ohos:margin="5vp 10vp",表示上外边距为 5vp,左右外边距为 10vp(下外边距默认为 0);第四个按钮未设置外边距。通过这些不同的外边距设置,可以看到按钮在表格中的位置发生了明显变化,合理运用外边距属性能够精确控制组件在表格中的布局,满足各种复杂的布局需求。

表格布局实战

(一)数据展示案例

下面我们通过一个实际的学生成绩表案例,更深入地展示表格布局在展示复杂数据时的强大功能。假设我们要展示一个包含学生姓名、语文成绩、数学成绩和英语成绩的表格。

首先,在布局文件中创建表格结构:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="5"

    ohos:column_count="4">

    <!-- 表头部分 -->

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="姓名"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="语文"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="数学"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="英语"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <!-- 数据行部分 -->

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="张三"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="85"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="90"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="88"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="李四"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="78"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="85"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="92"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="王五"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="90"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="88"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="95"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

</TableLayout>

在上述代码中,我们首先设置了表格的行数为 5,列数为 4 。前四行的文本组件构成了表头,通过设置ohos:background_element="#F0F0F0"来改变表头的背景颜色,使其与数据行区分开来,同时设置ohos:layout_alignment="center"使表头文本居中显示。从第五行开始,每四行文本组件为一组,构成一个学生的数据行,展示学生的姓名和各科成绩。通过这样的方式,我们创建了一个简单而清晰的学生成绩表。运行代码后,即可看到一个整齐排列的成绩表格,用户可以方便地查看每个学生的成绩信息。

(二)交互功能实现

在实际应用中,表格不仅仅是展示数据,还常常需要与用户进行交互。例如,为表格组件添加点击事件,当用户点击某个单元格时,获取该单元格的数据并进行相应处理。下面我们通过代码示例来展示如何实现这一功能。

假设我们在上述学生成绩表的基础上,为每个单元格添加点击事件,当点击单元格时,弹出一个提示框显示该单元格的数据。首先,在布局文件中为每个需要添加点击事件的组件(这里是每个<Text>组件)设置ohos:id属性,以便在代码中获取并设置点击事件:

<TableLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:row_count="5"

    ohos:column_count="4">

    <!-- 表头部分 -->

    <Text

        ohos:id="$+id:header_name"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="姓名"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:header_chinese"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="语文"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:header_math"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="数学"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:header_english"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="英语"

        ohos:text_size="20fp"

        ohos:background_element="#F0F0F0"

        ohos:layout_alignment="center" />

    <!-- 数据行部分 -->

    <Text

        ohos:id="$+id:name_zhang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="张三"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:chinese_zhang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="85"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:math_zhang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="90"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:english_zhang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="88"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:name_li"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="李四"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:chinese_li"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="78"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:math_li"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="85"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:english_li"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="92"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:name_wang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="王五"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:chinese_wang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="90"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:math_wang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="88"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

    <Text

        ohos:id="$+id:english_wang"

        ohos:height="wrap_content"

        ohos:width="wrap_content"

        ohos:text="95"

        ohos:text_size="18fp"

        ohos:layout_alignment="center" />

</TableLayout>

然后,在对应的 Java 代码中获取这些组件并设置点击事件:

import ohos.aafwk.ability.AbilitySlice;

import ohos.aafwk.content.Intent;

import ohos.agp.components.Component;

import ohos.agp.components.Text;

import ohos.agp.window.dialog.ToastDialog;

public class MainAbilitySlice extends AbilitySlice {

    @Override

    public void onStart(Intent intent) {

        super.onStart(intent);

        super.setUIContent(ResourceTable.Layout_ability_main);

        // 获取表头组件并设置点击事件

        Text headerName = (Text) findComponentById(ResourceTable.Id_header_name);

        headerName.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                new ToastDialog(getContext()).setText("点击了表头:姓名").show();

            }

        });

        Text headerChinese = (Text) findComponentById(ResourceTable.Id_header_chinese);

        headerChinese.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                new ToastDialog(getContext()).setText("点击了表头:语文").show();

            }

        });

        // 以此类推,为其他表头组件设置点击事件

        // 获取数据行组件并设置点击事件

        Text nameZhang = (Text) findComponentById(ResourceTable.Id_name_zhang);

        nameZhang.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                new ToastDialog(getContext()).setText("点击了单元格:张三").show();

            }

        });

        Text chineseZhang = (Text) findComponentById(ResourceTable.Id_chinese_zhang);

        chineseZhang.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                new ToastDialog(getContext()).setText("点击了单元格:85").show();

            }

        });

        // 以此类推,为其他数据行组件设置点击事件

    }

    @Override

    public void onActive() {

        super.onActive();

    }

    @Override

    public void onForeground(Intent intent) {

        super.onForeground(intent);

    }

}

在上述代码中,我们通过findComponentById方法获取每个<Text>组件,并使用setClickedListener方法为其设置点击事件。在点击事件的回调函数中,创建一个ToastDialog对象,将点击的单元格数据作为提示信息显示出来。这样,当用户点击表格中的任意单元格时,都能获取到该单元格的数据并通过提示框展示,实现了表格与用户之间的交互功能。通过这种方式,可以根据实际需求对点击单元格的数据进行更复杂的处理,如跳转到详细信息页面、进行数据编辑等 。

总结与展望

通过今天的学习,我们全面了解了 HarmonyOS 中表格布局(TableLayout)的使用方式。从创建基础表格框架,到设置行列属性,再到填充各种组件以及实现交互功能,表格布局为我们在 HarmonyOS 应用开发中展示数据提供了一种高效、直观的方式 。它能够使复杂的数据以整齐、有序的表格形式呈现,大大提升了用户获取信息的效率。

希望大家能够将今天所学的表格布局知识运用到实际项目中,通过不断练习和实践,熟练掌握其使用技巧。在后续的学习中,我们还将探索更多 HarmonyOS 的布局知识,如更加灵活的弹性布局、适用于复杂界面的相对布局等,它们将为我们的应用开发带来更多的可能性,让我们一起期待并继续深入学习吧!

相关文章:

HarmonyOS学习第12天:解锁表格布局的奥秘

表格布局初相识 不知不觉&#xff0c;我们在 HarmonyOS 的学习旅程中已经走到了第 12 天。在之前的学习里&#xff0c;我们逐步掌握了 HarmonyOS 开发的各种基础与核心技能&#xff0c;比如组件的基本使用、布局的初步搭建等&#xff0c;这些知识就像一块块基石&#xff0c;为我…...

基于 MetaGPT 自部署一个类似 MGX 的多智能体协作框架

MGX&#xff08;由 MetaGPT 团队开发的 mgx.dev&#xff09;是一个收费的多智能体编程平台&#xff0c;提供从需求分析到代码生成、测试和修复的全流程自动化功能。虽然 MGX 本身需要付费&#xff0c;但您可以通过免费服务和开源项目搭建一个类似的功能。以下是一个分步骤的实现…...

Cargo, the Rust package manager, is not installed or is not on PATH.

今天在Windows操作系统上通过pip 安装jupyter的时候遇到这个报错&#xff0c;Cargo, the Rust package manager, is not installed or is not on PATH.。 解决办法 官网&#xff1a;https://rustup.rs/# 下载&#xff1a;https://win.rustup.rs/x86_64 安装完成之后&#xff0c…...

Spring AI:开启Java开发的智能新时代

目录 一、引言二、什么是 Spring AI2.1 Spring AI 的背景2.2 Spring AI 的目标 三、Spring AI 的核心组件3.1 数据处理3.2 模型训练3.3 模型部署3.4 模型监控 四、Spring AI 的核心功能4.1 支持的模型提供商与类型4.2 便携 API 与同步、流式 API 选项4.3 将 AI 模型输出映射到 …...

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…...

c++ 文件及基本读写总结

在 C 中&#xff0c;文件操作是非常重要的一部分&#xff0c;主要用于将数据存储到文件中&#xff0c;或者从文件中读取数据。C 标准库提供了fstream头文件&#xff0c;其中包含了用于文件操作的类&#xff0c;主要有ifstream&#xff08;用于输入文件流&#xff0c;即从文件读…...

千峰React:组件与逻辑封装(上)

UI组件库及antd安装 UI组件库就是把页面的组件写好了&#xff0c;用的时候直接调用好了 进行一个安装的动作&#xff1a; 总之就是搭积木&#xff0c;可以调用里面写好的组件库拼接&#xff0c;也可以结合使用 antd布局和导航组件 组件总览 - Ant Design 这是通用部分 在用…...

Windows 10 远程桌面连接使用指南

目录 一、引言 二、准备工作 1、确认系统版本 2、服务器端设置 三、客户端连接 1、打开远程桌面连接程序 2、输入连接信息 3、输入登录凭证 4、开始使用远程桌面 四、移动端连接&#xff08;以 iOS 为例&#xff09; 1、下载安装应用 2、添加远程计算机 3、进行连接…...

​使用Kali中的Metasploit生成木马控制Windows系统

使用Kali中的Metasploit生成木马控制Windows系统 &#xff08;第九天 9.20&#xff09; 一、kali及Metasploit kali基于debin的数字取证系统&#xff0c;上面集成很多渗透测试工具&#xff0c;其前身是BT5 R3&#xff08;BrackTrack&#xff09;&#xff0c;在信息搜集方面发…...

Python与Web3.py库:构建去中心化应用的未来

Python与Web3.py库&#xff1a;构建去中心化应用的未来 在区块链的世界里&#xff0c;“去中心化”是最核心的理念之一&#xff0c;它赋予了用户更多的控制权和自由&#xff0c;消除了传统中心化系统中的单点故障和信任问题。而在这场技术革命中&#xff0c;Web3.0无疑是最受瞩…...

《Python实战进阶》No 8:部署 Flask/Django 应用到云平台(以Aliyun为例)

第8集&#xff1a;部署 Flask/Django 应用到云平台&#xff08;以Aliyun为例&#xff09; 2025年3月1日更新 增加了 Ubuntu服务器安装Python详细教程链接。 引言 在现代 Web 开发中&#xff0c;开发一个功能强大的应用只是第一步。为了让用户能够访问你的应用&#xff0c;你需…...

RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter

​​标题&#xff1a;RAP:基于稀疏相关适配器的高效文本视频检索 原文链接&#xff1a;RAP: Efficient Text-Video Retrieval with Sparse-and-Correlated Adapter - ACL Anthology 发表&#xff1a;ACL-2024(NLP领域CCF A类) 摘要 文本-视频检索&#xff08;TVR&#xff0…...

C++ ++++++++++

初始C 注释 变量 常量 关键字 标识符命名规则 数据类型 C规定在创建一个变量或者常量时&#xff0c;必须要指定出相应的数据类型&#xff0c;否则无法给变量分配内存 整型 sizeof关键字 浮点型&#xff08;实型&#xff09; 有效位数保留七位&#xff0c;带小数点。 这个是保…...

用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较

文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...

JavaEE基础之- 过滤器和监听器Filter and Listener

目录 1. 过滤器 Filter 1.1. 初识过滤器 1.1.1. 过滤器概念 1.1.2. 过滤器例子 1.2. 过滤器详解 1.2.1. 过滤器生命周期 1.2.2. FilterConfig 1.2.3. FilterChain 1.1.4. 过滤器执行顺序 1.2.5. 过滤器应用场景 1.2.6. 过滤器设置目标资源 1.2.7. 过滤器总结 1.3 过滤…...

JavaAdv01——字节流和字符流

一、核心概念解析 1. 字节流&#xff08;Byte Streams&#xff09; 字节流家族&#xff1a; 输入流&#xff1a;InputStream&#xff08;抽象类&#xff09; FileInputStream ByteArrayInputStream BufferedInputStream 输出流&#xff1a;OutputStream FileOutputStream…...

HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法

【高心星出品】 文章目录 多线程Worker和Sendable的使用方法开发步骤运行结果 多线程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一种多线程的实现方式&#xff0c;它允许开发者在后台线程中执行长耗时任务&#xff0c;从而避免阻塞主线程并提高应用的响应性。 S…...

AI赋能传热学研究:创新与乐趣的深度融合

在科技飞速发展的当下&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐渗透到各个领域&#xff0c;为不同行业带来了前所未有的变革与机遇。对于传热学研究而言&#xff0c;AI的介入不仅极大地提高了研究效率&#xff0c;还为研究者带来了全新的体验和思考。本文将深入探…...

Hive-03之传参、常用函数、explode、lateral view、行专列、列转行、UDF

大数据分析利器之hive 一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1、hive的参数传递 1、Hive命令行 语法结构 hive [-hiveconf xy]* [<-i filename&…...

如何将Vue项目部署至 nginx

一、准备工作 1.确保安装了开发软件VS Code&#xff08;此处可查阅安装 VS Code教程&#xff09;&#xff0c;确保相关插件安装成功 2.安装Node.js和创建Vue项目&#xff08;此处可查阅安装创建教程&#xff09; 3.成功在VS Code运行一个Vue项目&#xff08;此处可查阅运行教…...

SwiftUI之状态管理全解析

文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…...

Java-servlet(一)Web应用与服务端技术概念知识讲解

Java-servlet&#xff08;一&#xff09;Web应用与服务端技术概念知识讲解 前言一、Web 应用1.WEB CS BS 对比2.WEB 介绍3.web 与 http 的关系 二、servlet服务端技术1. 公共网关接口&#xff08;CGI&#xff09;2. servlet 是什么3.servlet 作用4. servlet 特性 前言 在当今时…...

多个pdf合并成一个pdf的方法

将多个PDF文件合并优点&#xff1a; 能更容易地对其进行归档和备份.打印时可以选择双面打印&#xff0c;减少纸张的浪费。比如把住宿发票以及滴滴发票、行程单等生成一个pdf&#xff0c;双面打印或者无纸化办公情况下直接发送给财务进行存档。 方法: 利用PDF24 Tools网站 …...

数据集笔记:新加坡停车费

data.gov.sg 该数据集包含 新加坡各停车场的停车费&#xff0c;具体信息包括&#xff1a; 停车场名称&#xff08;Carpark&#xff09;&#xff1a;如 Toa Payoh Lorong 8、Ang Mo Kio Hub、Bras Basah Complex 等。停车区域类别&#xff08;Category&#xff09;&#xff1a…...

易错点abc

在同一个输入流上重复创建Scanner实例可能会导致一些问题&#xff0c;包括但不限于输入流的混乱。尤其是在处理标准输入&#xff08;System.in&#xff09;时&#xff0c;重复创建Scanner对象通常不是最佳实践&#xff0c;因为这可能导致某些输入数据丢失或者顺序出错。 为什么…...

leetcode第39题组合总和

原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以…...

【iOS】小蓝书学习(七)

小蓝书学习&#xff08;七&#xff09; 前言第47条&#xff1a;熟悉系统框架第48条&#xff1a;多用枚举块&#xff0c;少用for循环第50条&#xff1a;构建缓存使选用NSCache而非NSDictionary第51条&#xff1a;精简initialize与load的实现代码第52条&#xff1a;别忘了NSTimer…...

基于第三方SDK的Windows平台全功能RTMP|RTSP直播播放器深度解析

一、引言 在当今数字化时代&#xff0c;直播技术的应用场景不断拓展&#xff0c;从娱乐直播到教育、医疗、工业等多个领域&#xff0c;都对直播播放器的功能和性能提出了更高的要求。本文将介绍一款基于第三方SDK实现的全功能直播播放器&#xff0c;从技术实现、功能特点、用户…...

命名实体识别与文本生成算法

在自然语言处理&#xff08;NLP&#xff09;的浩瀚星空中&#xff0c;命名实体识别&#xff08;Named Entity Recognition, NER&#xff09;与文本生成算法如同两颗璀璨的星辰&#xff0c;各自闪耀&#xff0c;又相互辉映&#xff0c;共同推动着人工智能技术在语言理解与生成领…...

题解 | 牛客周赛83 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 输出两个不是同一方位的字符中的任意一个就行 import java.io.*; import java.math.*; import java…...

样式和ui(待更新)

element-plus 先在项目下执行安装语句执行按需导入的命令按照官方文档修改vitest.json sass样式定制 npm -i sass -D在项目下准备定制的样式文件 styles/element/index.scss(!注意这里是.scss文件在vitest.json 修改配置文件 Components({resolvers: [ElementPlusResolver(…...

「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」

Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时&#xff0c;操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能&#xff0c;让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…...

C++的类和对象入门

目录 目录 目录 一、类 1.1类的定义 1.2访问限定符 1.3类域 1.4类的命名规范 1.5class和struct的默认访问权限 二、类的实例化 2.2对象的大小和存储 2.3空类的大小 三、this指针 3.1this指针的定义 3.2this指针的作用 3.2.1区分同名变量和局部变量 3.2.2返回对象…...

【清华大学】DeepSeek从入门到精通完整版pdf下载

DeepSeek从入门到精通.pdf 一共104页完整版 下载链接: https://pan.baidu.com/s/1-gnkTTD7EF2i_EKS5sx4vg?pwd1234 提取码: 1234 或 链接&#xff1a;https://pan.quark.cn/s/79118f5ab0fd 一、DeepSeek 概述 背景与定位 DeepSeek 的研发背景 核心功能与技术特点&#xff08…...

deepseek使用记录18——文化基因之文化融合

文明长河中的生命浪花 在洛阳白马寺的银杏树下&#xff0c;年轻母亲指着"农禅并重"碑刻给孩子讲述祖辈耕作的故事&#xff1b;在哔哩哔哩的直播间里&#xff0c;00后女孩穿着汉服跳起街舞&#xff0c;弹幕飘过"这才是文化缝合怪"。当文明交融的宏大叙事照…...

Java 大视界 -- Java 大数据在智慧文旅游客流量预测与景区运营优化中的应用(110)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

面试题:说一下你对DDD的了解?

面试题:说一下你对DDD的了解? 在面试中,关于 DDD(领域驱动设计,Domain-Driven Design) 的问题是一个常见的技术考察点。DDD 是一种软件设计方法论,旨在通过深入理解业务领域来构建复杂的软件系统。以下是一个清晰、详细的回答模板,帮助你在面试中脱颖而出: DDD 的定义…...

网络编程——UDP

UDP编程使用套接字&#xff08;Socket&#xff09;进行通信。下面是基于UDP协议进行网络编程的基本步骤。 1. 创建套接字 首先&#xff0c;客户端和服务器都需要通过 socket() 系统调用创建一个UDP套接字。 2. 配置地址和端口 UDP是无连接的&#xff0c;因此你不需要像TCP一…...

【网络安全 | 渗透测试】GraphQL精讲二:发现API漏洞

未经许可,不得转载。 推荐阅读:【网络安全 | 渗透测试】GraphQL精讲一:基础知识 文章目录 GraphQL API 漏洞寻找 GraphQL 端点通用查询常见的端点名称请求方法初步测试利用未清理的参数发现模式信息使用 introspection探测 introspection运行完整的 introspection 查询可视化…...

代码随想录Day23 | 39.组合总和、40.组合总和II、131.分割回文串

39.组合总和 自己写的代码&#xff1a; class Solution { public:vector<int> path;vector<vector<int>> res;int sum0;void backtracking(vector<int>& candidates,int target,int startIndex){if(sum>target) return;if(sumtarget){res.pus…...

MyBatis 新手入门教程:基础操作篇

MyBatis 新手入门教程&#xff1a;基础操作篇 适合人群&#xff1a;无 MyBatis 使用经验者 &#xff08;完整版3.3准时发&#xff0c;此篇为新手入门的基础操作&#xff09; 一、MyBatis 是什么&#xff1f; 简单理解&#xff1a; MyBatis 是一个帮你操作数据库的工具&#x…...

zjbdt

嵌入式软件工程师可以通过考取相关职业证书来提升专业能力和职业竞争力。以下是几种含金量较高且广受认可的证书&#xff1a; 1. NIEH 嵌入式技术工程师证书 颁发机构&#xff1a;教育部考试中心级别&#xff1a;初级、中级、高级内容&#xff1a;涵盖嵌入式系统的基础理论、开…...

行为型模式 - 中介者模式 (Mediator Pattern)

行为型模式 - 中介者模式 (Mediator Pattern) 中介者模式的核心思想是将对象之间的复杂交互封装到一个中介者对象中&#xff0c;从而降低对象之间的耦合度。 import java.util.ArrayList; import java.util.List;// 抽象中介者类 abstract class TowerMediator {public abstra…...

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…...

同步类型对比

同步类型对比 特性准同步 (Quasi-Synchronization)完全同步 (Complete Synchronization)渐进同步 (Asymptotic Synchronization)定义系统状态在有限时间内接近同步&#xff0c;但存在微小误差。系统状态在有限时间内完全一致。系统状态随时间趋近于同步&#xff0c;但可能需要…...

python爬虫Scapy框架(1)

简介 什么是框架&#xff1f; 所谓的框&#xff0c;其实说白了就是一个【项目的半成品】&#xff0c;该项目的半成品需要被集成了各种功能且具有较强的通用性。 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;非常出名&#xff0c;非…...

java容器 LIst、set、Map

Java容器中的List、Set、Map是核心数据结构&#xff0c;各自适用于不同的场景 一、List&#xff08;有序、可重复&#xff09; List接口代表有序集合&#xff0c;允许元素重复和通过索引访问&#xff0c;主要实现类包括&#xff1a; ArrayList 底层结构&#xff1a;动态数组…...

2W8000字 LLM架构文章阅读指北

❝ 大模型架构专栏已经更新了30多篇文章。完整的专栏内容欢迎订阅&#xff1a; LLM 架构专栏 1、LLM大模型架构专栏|| 从NLP基础谈起 2、 LLM大模型架构专栏|| 自然语言处理&#xff08;NLP&#xff09;之建模 3、 LLM大模型架构之词嵌入&#xff08;Part1&#xff09; 3、 LLM…...

Milkv-duo256 接入tuya 云并实现远程智能控制

tuyaopen-embedded-core 是将 https://github.com/tuya/tuyaopen 连接 tuya 云相关核心组件重新组织&#xff0c;可快速嵌入至各种嵌入式平台使用。 tuyaopen-embedded-core 可通过 WiFi、有线以太网、CAT-1、4G 等多种方式接入涂鸦云&#xff0c;实现设备远程控制、OTA 等功能…...

Hadoop之02:MR-图解

1、不是所有的MR都适合combine 1.1、map端统计出了不同班级的每个学生的年龄 如&#xff1a;(class1, 14)表示class1班的一个学生的年龄是14岁。 第一个map任务&#xff1a; class1 14 class1 15 class1 16 class2 10第二个map任务&#xff1a; class1 16 class2 10 class…...