HarmonyOS实战—可编辑的卡片交互

简介: HarmonyOS实战—可编辑的卡片交互

HarmonyOS实战


前言

在前面的天气卡片设计中,我们设计了一个天气类卡片在桌面进行7日天气的直观显示。但其并不具备选择城市切换的功能,实用性并不高。


所以,今天博主将详细介绍鸿蒙原子化开发的编辑交互功能。


何为卡片编辑功能?

首先,我们需要来看一张图,认识一下有无卡片编辑功能样式到底有何不同。具体效果图如下所示:


可以看到,默认情况下鸿蒙的手机卡片是没有任何编辑功能的,那么如果让其有编辑功能呢?


答案在我们的config.json文件的卡片定义中。示例代码如下:

"forms": [
      {
        "jsComponentName": "widget",
        "isDefault": true,
        "formConfigAbility": "ability://com.liyuanjinglyj.jsweather.slice.WeatherChoiceAbility",
        "scheduledUpdateTime": "10:30",
        "defaultDimension": "2*4",
        "name": "widget",
        "description": "桌面7天天气直观卡片",
        "colorMode": "auto",
        "type": "JS",
        "supportDimensions": [
          "2*4"
        ],
        "updateEnabled": true,
        "updateDuration": 1
      }
],


感兴趣的读者可以自己按照博文:HarmonyOS实战—卡片的样式设计,创建一个随机的卡片,看看默认定义与这段代码有何不同。


这里,博主就直接给出答案,这里比默认的卡片定义多了一个formConfigAbility属性,该属性就是编辑功能的界面。


在这个界面,用户可以自定义功能进行卡片的更新以及样式的变化。比如这里的天气卡片,我们可以编辑传入城市,然后更新卡片的天气。


定义编辑界面

界面的交互逻辑

尽然说到需要更新天气,那么我们来定义这个编辑界面WeatherChoiceAbility界面,它是一个Java界面,只需要在XML布局中添加控件,进行操作即可。代码如下:

public class WeatherChoiceAbility extends Ability {
    private static final HiLogLabel TAG = new HiLogLabel(HiLog.DEBUG, 0x0, WeatherChoiceAbility.class.getName());
    private TextField textField;
    private Button button;
    private String url="https://yiketianqi.com/api?version=v9&appid=73913812&appsecret=458XM5hq&city=";
    private long formId;
    private String city;
    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_weather_choice_slice);
        this.textField=(TextField)findComponentById(ResourceTable.Id_ability_weather_choice_textfield);
        this.button=(Button)findComponentById(ResourceTable.Id_ability_weather_choice_button);
        formId=intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, -1);
        this.button.setClickedListener(new Component.ClickedListener() {
            @Override
            public void onClick(Component component) {
                TaskDispatcher refreshUITask = createParallelTaskDispatcher("", TaskPriority.DEFAULT);
                refreshUITask.syncDispatch(()->{
                    ZSONArray zsonArray=getData(textField.getText().trim());
                    HiLog.error(TAG,zsonArray.toString());
                    try {
                        ZSONObject object=new ZSONObject();
                        object.put("itemTitle",city);
                        object.put("weatherList",zsonArray);
                        FormBindingData bindingData = new FormBindingData(object);
                        if(!updateForm(formId,bindingData)){
                            HiLog.error(TAG,"updateForm error");
                        }else{
                            terminateAbility();
                        }
                    }catch (Exception e){
                        HiLog.error(TAG,"updateForm error");
                    }
                });
            }
        });
    }
    private ZSONArray getData(String cityStr){
        LYJUtils http = new LYJUtils();
        String response = http.doGet(url+cityStr);
        ZSONObject res = ZSONObject.stringToZSON(response);
        city = res.getString("city");
        HiLog.info(TAG, city);
        ZSONArray data = res.getZSONArray("data");
        WeatherImageMap weatherImageMap=new WeatherImageMap();
        Map<String,String> map= weatherImageMap.getMap();
        ZSONArray weatherList=new ZSONArray();
        for(int i=0;i<data.size();i++){
            ZSONObject zsonObject = (ZSONObject)data.get(i);
            ZSONObject newObject=new ZSONObject();
            newObject.put("image",map.get(zsonObject.getString("wea_day")));
            newObject.put("wea_day",zsonObject.get("wea_day"));
            newObject.put("week",zsonObject.get("week"));
            weatherList.add(newObject);
        }
        ZSONObject list_data = (ZSONObject)data.get(0);
        String content=list_data.getString("date");
        return weatherList;
    }
}


代码很简单,基本思路就是获取卡片的id,然后获取用户选择城市的天气信息,最后使用updateForm进行更新。


额外需要注意的是,传递给卡片的数据不能太长,先前博主直接将所有的天气数据updateForm后,直接导致数据丢失,最后只用了3个数据,才传递成功。(具体多长才算长,这个博主也没有研究,尽量只传递卡片需要的数据)


界面的布局

这里使用的ability_weather_choice_slice.xml布局文件只有一个文本框加上一个按钮,示例代码如下所示:

<?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:margin="20vp"
    ohos:orientation="vertical"
    ohos:top_margin="100vp">
    <TextField
        ohos:id="$+id:ability_weather_choice_textfield"
        ohos:height="40vp"
        ohos:width="match_parent"
        ohos:background_element="$graphic:textfield_graphic"
        ohos:hint="请输入城市名(去掉市,县,洲)"
        ohos:margin="20vp"
        ohos:padding="5vp"
        ohos:text_alignment="vertical_center"
        ohos:text_size="25vp"/>
    <Button
        ohos:id="$+id:ability_weather_choice_button"
        ohos:height="match_content"
        ohos:width="match_parent"
        ohos:background_element="$graphic:textfield_graphic"
        ohos:bottom_padding="5vp"
        ohos:text="获取城市天气同步到卡片"
        ohos:text_color="#FF0000"
        ohos:text_size="25vp"
        ohos:top_padding="5vp"/>
</DirectionalLayout>


代码中并没有加入城市的容错判断,感兴趣的可以自己加入,这里博主主要介绍卡片的编辑功能以及信息的同步。


当然,定义的Java界面需要在config.json中定义后才能使用,定义代码如下:

{
    "orientation": "unspecified",
    "name": "com.liyuanjinglyj.jsweather.slice.WeatherChoiceAbility",
    "icon": "$media:icon",
    "description": "$string:entry_MainAbility",
    "label": "$string:entry_MainAbility",
    "type": "page",
    "launchType": "standard"
}


运行之后,效果如首图所示。


本文源代码地址:https://github.com/liyuanjinglyj/JsWeather

相关文章
|
1月前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
63 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
1月前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
55 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
1月前
|
IDE 开发工具
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
本文介绍了如何使用 Flutter SDK 3.22.0 搭建鸿蒙开发环境。首先安装 Flutter SDK 3.22.0,并通过 FVM 管理多个版本。接着配置项目,使用 `fvm use custom_3.22.0` 设置自定义 SDK 版本。添加鸿蒙平台支持并进行项目签名,最后通过 `fvm flutter run` 运行项目。详细步骤包括安装、项目配置、签名和运行,确保开发环境顺利搭建。
119 7
鸿蒙Flutter实战:11-使用 Flutter SDK 3.22.0
|
29天前
|
JSON JavaScript 前端开发
harmony-chatroom 自研纯血鸿蒙OS Next 5.0聊天APP实战案例
HarmonyOS-Chat是一个基于纯血鸿蒙OS Next5.0 API12实战开发的聊天应用程序。这个项目使用了ArkUI和ArkTS技术栈,实现了类似微信的消息UI布局、输入框光标处插入文字、emoji表情图片/GIF动图、图片预览、红包、语音/位置UI、长按语音面板等功能。
62 2
|
1月前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
72 3
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
113 1
|
1月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
86 1
|
2月前
|
JavaScript 数据管理 编译器
揭秘 ArkTS 与 TypeScript 的神秘差异:鸿蒙系统开发者的必备知识与实战技巧
【10月更文挑战第18天】ArkTS 是华为为鸿蒙系统(HarmonyOS)推出的开发语言,作为 TypeScript 的超集,它针对鸿蒙系统的分布式特性和需求进行了优化和扩展。ArkTS 强化了分布式数据管理、类型系统、编译与运行时性能,并支持声明式 UI 和专为鸿蒙设计的 API,使开发者能够更高效地开发跨设备协同工作的应用。
147 6
|
1月前
|
移动开发 资源调度 IDE
鸿蒙Taro实战:01-搭建开发环境
本文介绍了如何使用 Taro 4.x 框架搭建鸿蒙应用开发环境。主要内容包括:下载并配置 DevEco IDE,创建鸿蒙项目,安装 Taro 4.x,初始化 Taro 项目,配置鸿蒙插件和编译配置,修改 `package.json`,运行 Taro 和鸿蒙项目。通过本文,读者可以快速上手鸿蒙应用开发。
|
1月前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
131 0