鸿蒙学习笔记之使用 XML 方式创建布局

简介: 平常使用的 APP 应用会在屏幕上显示一个用户界面,该界面用来显示所有可被用户查看和交互的内容。而应用中所有的用户界面元素都是由 Component 和 ComponentContainer 对象构成。Component 是绘制在屏幕上的一个对象,用户能与之交互。ComponentContainer 是一个用于容纳其他 Component 和 ComponentContainer 对象的容器。

前言

平常使用的 APP 应用会在屏幕上显示一个用户界面,该界面用来显示所有可被用户查看和交互的内容。而应用中所有的用户界面元素都是由 Component 和 ComponentContainer 对象构成。


  • Component 是绘制在屏幕上的一个对象,用户能与之交互。
  • ComponentContainer 是一个用于容纳其他 Component 和 ComponentContainer 对象的容器。


image.png

Java UI 布局

Java UI 框架中,提供了两种编写布局的方式:代码方式创建布局XML 方式声明 UI 布局。


XML 声明布局的方式更加简便直观。 每个 Component 和 ComponentContainer 对象中的大部分属性支持在 XML 中进行设置,它们都有各自的 XML 属性列表。


Component 作为组件的基类,拥有各个组件常用的属性,例如 ID、布局参数等。


代码方式创建布局的方式比较麻烦,需要在 AbilitySlice 中分别创建组件和布局,并将它们进行组织关联。


本篇文章讲一下如何通过 XML 方式创建布局

XML 创建布局

XML 创建布局的方式简便直观。每一个 Component 和 ComponentContainer 对象大部分属性都支持在 XML 中进行设置,它们都有各自的 XML 属性列表。某些属性仅适用于特定的组件,例如:只有 Text 支持 “text_color” 属性,不支持该属性的组件如果添加了该属性,该属性则会被忽略。具有继承关系的组件子类将继承父类的属性列表,Component 作为组件的基类,拥有各个组件常用的属性,比如:ID、布局参数等。


首先,在 src\main\resources\base\layout 目录下 , 创建布局文件 ;


右键点击 layout 目录 , 在弹出的菜单中选择 " New / Layout Resource File " 选项 :


image.png


默认添加线性布局 DirectionLayout 作为根布局,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:orientation="vertical">
</DirectionalLayout>

加入 Text 子组件

Text,顾名思义,文本。


  • 标识属性 : ohos:id="$+id:text" , 为该组件设置标识 text , 在 Java 代码中可以通过该 id 标识获取 XML 布局中定义的组件 ; 其中 + 号作用是如果该 id 不存在则生成 id 常量 , 如果该 id 存在则使用已存在的常量 ; 在 Java 代码中可以通过该生成的常量来获取该组件 ;
  • 宽高属性 : 宽度充满父容器 ohos:width=“match_parent” ; 高度包裹内容 ohos:height=“match_content” ;
  • 文字内容属性 : 这是 Text 组件独有的属性 , ohos:text=“自定义布局 Text 组件” , 显示 " 自定义布局 Text 组件 " 文字 ;
  • 文字字体大小属性 : 这是 Text 组件独有的属性 , ohos:text_size=“100” ;
  • 文本对齐方式属性 : 这是 Text 组件独有的属性 , ohos:text_alignment=“center” 居中 ;


代码如下:

<Text
        ohos:id="$+id:text"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text_color="#FFDE1968"
        ohos:text="一起学习鸿蒙"
        ohos:text_size="40fp"
        ohos:center_in_parent="true"
        />

加入 Button 子组件

 <Button
        ohos:id="$+id:button"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text="点击此处有惊喜"
        ohos:text_size="19fp"
        ohos:text_color="#FF0C43CF"
        ohos:top_padding="8vp"
        ohos:bottom_padding="8vp"
        ohos:right_padding="70vp"
        ohos:left_padding="70vp"
        ohos:center_in_parent="true"
        ohos:below="$id:text"
        ohos:margin="10vp"/>


完整的 XML 文件如下:

<?xml version="1.0" encoding="utf-8"?>
<DependentLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:width="match_parent"
    ohos:height="match_parent"
    ohos:orientation="vertical"
    ohos:padding="32">
    <Text
        ohos:id="$+id:text"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text_color="#FFDE1968"
        ohos:text="一起学习鸿蒙"
        ohos:text_size="40fp"
        ohos:center_in_parent="true"
        />
    <Button
        ohos:id="$+id:button"
        ohos:width="match_content"
        ohos:height="match_content"
        ohos:text="点击此处有惊喜"
        ohos:text_size="19fp"
        ohos:text_color="#FF0C43CF"
        ohos:top_padding="8vp"
        ohos:bottom_padding="8vp"
        ohos:right_padding="70vp"
        ohos:left_padding="70vp"
        ohos:center_in_parent="true"
        ohos:below="$id:text"
        ohos:margin="10vp"/>
</DependentLayout>

创建 Ability

右键点击想要创建 Ability 的包名 , 选择 New / Ability / Empty Page Ability ( Java ) 选项:


image.png


在弹出的对话框中输入 Ability 类名, 比如 XMLAbility , 点击 Finish 按钮 ;


image.png


然后就会自动生成两个 Java 文件:XMLAbility.javaXMLAbilitySlice.java,如图:


image.png


创建成功后,也会自动配置刚刚创建的 XMLAbility,我们会发现在 config.json 中的 “abilities” 标签下添加如下了 XMLAbility 配置 :

{
        "orientation": "unspecified",
        "name": "com.example.helloworld.XMLAbility",
        "icon": "$media:icon",
        "description": "$string:xmlability_description",
        "label": "$string:entry_XMLAbility",
        "type": "page",
        "launchType": "standard"
      }


设置 XMLAbility 为启动 Ability , 将 config.json 中该 XMLAbility 配置放在 “abilities”: [] 标签中第一个 , 按照如下配置 , 自定义的 com.example.helloworld.XMLAbility 就是应用启动后显示的第一个 Ability, 此时完整的 config.json 代码如下:

{
  "app": {
    "bundleName": "com.example.helloworld",
    "vendor": "example",
    "version": {
      "code": 1000000,
      "name": "1.0.0"
    }
  },
  "deviceConfig": {},
  "module": {
    "package": "com.example.helloworld",
    "name": ".MyApplication",
    "mainAbility": "com.example.helloworld.MainAbility",
    "deviceType": [
      "phone"
    ],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry",
      "installationFree": true
    },
    "abilities": [
      {
        "orientation": "unspecified",
        "name": "com.example.helloworld.XMLAbility",
        "icon": "$media:icon",
        "description": "$string:xmlability_description",
        "label": "$string:entry_XMLAbility",
        "type": "page",
        "launchType": "standard"
      },
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "name": "com.example.helloworld.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "$string:entry_MainAbility",
        "type": "page",
        "launchType": "standard"
      }
    ]
  }
}

XMLAbility 加载布局文件

Ability 中加载布局文件 , 在 onStart 中调用 super.setUIContent ( ) 方法 , 设置加载的布局文件 ID , 代码如下 :

package com.example.helloworld;
import com.example.helloworld.slice.XMLAbilitySlice;
import ohos.aafwk.ability.Ability;
import ohos.aafwk.content.Intent;
public class XMLAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
//        super.setMainRoute(XMLAbilitySlice.class.getName());
        // 显示自定义的 ability_xml.xml 布局文件
        super.setUIContent(ResourceTable.Layout_ability_xml);
    }
}

运行代码:

image.png

总结

本文学习如何用 XML 的方式编写了一个包含文本和按钮的页面,可能有很多地方还写的不是很好,界面也是随意编写的,不是很美观。


但至少是我们自己创建的一个页面。接下来将继续学习其他 Java UI 中的常见组件,争取早日写出一个好看点的像常规使用的 APP UI 界面。

相关文章
|
1月前
|
XML 编解码 搜索推荐
XML 布局小技巧
【10月更文挑战第24天】通过掌握这些 XML 布局小技巧,我们可以更轻松地设计出高质量的用户界面,提升用户体验。在实际应用中,要根据具体项目的需求和特点,灵活运用这些技巧,不断探索和创新,打造出独具特色的界面布局。
63 1
|
19天前
|
UED
「Mac畅玩鸿蒙与硬件40」UI互动应用篇17 - 照片墙布局
本篇将带你实现一个简单的照片墙布局应用,通过展示多张图片组成照片墙效果,用户可以点击图片查看其状态变化。
133 67
|
5天前
|
缓存 API 开发者
基于HarmonyOS 5.0 (Next)的一种面向多设备跨平台的高性能自适应布局能力研究和实现
随着万物互联时代的到来,操作系统作为连接设备、应用与用户体验的核心愈发重要。华为发布的HarmonyOS 5.0(Next)是一款完全自主的手机操作系统,实现了全栈自研,在技术架构和生态体验上进行了颠覆性升级。本文聚焦于基于HarmonyOS 5.0(Next)实现多设备跨平台的高性能自适应布局能力,通过深入分析其技术特点和生态优势,结合开发实践探讨如何利用自适应布局和响应式布局技术,确保应用在多种设备上提供一致且优质的用户体验。研究将基于HarmonyOS 5.0(Next)的分布式能力和ArkTS编程语言,展示多设备跨平台环境下实现高性能自适应布局的方法,推动鸿蒙生态的发展。
60 16
基于HarmonyOS 5.0 (Next)的一种面向多设备跨平台的高性能自适应布局能力研究和实现
|
3天前
|
物联网 开发工具 Android开发
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS产生的背景
HarmonyOS是华为自主研发的分布式操作系统,旨在应对美国“实体清单”带来的技术封锁。2019年首次亮相,它不仅支持手机、平板等多终端设备,还通过统一的软件系统解决了不同设备间的体验割裂问题。HarmonyOS强调全场景智能互联,提升设备间的安全性和协同能力。其商用版本基于OpenHarmony开源项目开发,而HarmonyOS NEXT则是去除了AOSP代码的纯自研版本,代表了未来发展方向。
36 12
|
5月前
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
鸿蒙使用 @Builder扩展出来的布局数据更新没法更新UI
189 1
|
1月前
|
开发者 UED 容器
鸿蒙next版开发:ArkTS组件通用属性(Flex布局)
在HarmonyOS next中,ArkTS的Flex布局是一种强大且灵活的布局方式,支持水平或垂直方向排列元素,并能动态调整大小和位置以适应不同屏幕。主要属性包括justifyContent、alignItems、direction和wrap,适用于导航栏、侧边栏和表单等多种场景。示例代码展示了如何使用这些属性创建美观的布局。
82 10
|
1月前
|
UED 开发者 容器
鸿蒙next版开发:ArkTS组件通用属性(布局约束)
在HarmonyOS next中,ArkTS提供了一系列通用属性来设置组件的布局约束,使开发者能够灵活控制组件的布局行为。本文详细解读了这些属性,包括`space`、`justifyContent`、`alignItems`、`layoutWeight`、`matchParent`和`wrapContent`,并通过示例代码展示了它们的使用方法。这些属性有助于实现响应式布局、动态界面调整和提升用户体验。
79 5
|
2月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
352 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
1月前
|
开发者 容器
Flutter&鸿蒙next 布局架构原理详解
本文详细介绍了 Flutter 中的主要布局方式,包括 Row、Column、Stack、Container、ListView 和 GridView 等布局组件的架构原理及使用场景。通过了解这些布局 Widget 的基本概念、关键属性和布局原理,开发者可以更高效地构建复杂的用户界面。此外,文章还提供了布局优化技巧,帮助提升应用性能。
108 4
|
1月前
|
容器
深入理解 Flutter 鸿蒙版的 Stack 布局:适配屏幕与层叠样式布局
Flutter 的 Stack 布局组件允许你将多个子组件层叠在一起,实现复杂的界面效果。本文介绍了 Stack 的基本用法、核心概念(如子组件层叠、Positioned 组件和对齐属性),以及如何使用 MediaQuery 和 LayoutBuilder 实现响应式设计。通过示例展示了照片展示与文字描述、动态调整层叠布局等高级用法,帮助你构建更加精美和实用的 Flutter 应用。
138 2

热门文章

最新文章

相关课程

更多