HarmonyOS鸿蒙Next中在应用内怎么只添加选中的服务卡片到桌面

HarmonyOS鸿蒙Next中在应用内怎么只添加选中的服务卡片到桌面 【问题描述】:我在from.json文件中定义的有八个卡片类型,使用 openFormManager 打开小组件管理器的时候怎么只展示当前我选中的卡片,不展示其他类型卡片(不要红色框内结构),我想要的是这种效果 cke_95642.png

【问题现象】: cke_82060.png

【版本信息】:api21模拟器,cke_36777.png

【复现代码】:应用内拉起卡片管理加桌-应用内请求卡片加桌-ArkTS卡片提供方开发指导-ArkTS卡片开发(推荐)-Form Kit(卡片开发服务)-应用框架 - 华为HarmonyOS开发者 参考文档进行开发

【尝试解决方案】:我在from.json中只保留一种卡片类型,拉起组件管理器就只展示一种,但是我主要应用做的就是多种小组件展示,这个跟我的主要功能不匹配,所以想问一下需要在拉起卡片的时候传入什么参数,能实现只拉起单个属性的卡片,而不是拉起所有类型供我选择


更多关于HarmonyOS鸿蒙Next中在应用内怎么只添加选中的服务卡片到桌面的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,应用内添加选中服务卡片到桌面,需调用FormKit的addForm接口。开发者需在应用内提供卡片选择界面,用户选择后,通过addForm方法将指定卡片ID的卡片添加到桌面。此过程需确保应用已申请ohos.permission.REQUIRE_FORM权限,并在module.json5中正确声明卡片能力。

更多关于HarmonyOS鸿蒙Next中在应用内怎么只添加选中的服务卡片到桌面的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,openFormManager接口目前不支持直接筛选并仅展示指定的单个卡片类型。该接口的设计是展示应用在form_config.json中声明的所有可用卡片,供用户选择添加。

要实现您期望的“仅展示选中卡片”的效果,需要调整实现思路。核心方法是:动态管理form_config.json文件

具体方案:

  1. 准备多个配置文件:为每个需要独立展示的卡片类型准备一个独立的form_config.json文件。或者,准备一个“基础”配置文件模板。

  2. 动态切换配置文件

    • 在应用逻辑中,当用户触发“添加某个特定卡片到桌面”的操作时(例如点击某个按钮)。
    • 在调用openFormManager之前,通过代码将应用的form_config.json文件内容动态替换为只包含目标卡片类型定义的版本。
    • 然后立即调用openFormManager。此时管理器将只读取到当前配置文件中的唯一卡片类型,从而实现仅展示该卡片的效果。
    • 操作完成后(无论用户是否成功添加),可以将配置文件恢复为包含所有卡片的完整版本,以确保应用其他功能正常。

关键代码思路 (ArkTS):

import formInfo from '@ohos.app.form.formInfo';
import formBindingData from '@ohos.app.form.formBindingData';
import Want from '@ohos.app.ability.Want';
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';

// 假设您有多个预置的配置文件路径
const FULL_CONFIG_PATH = '.../form_config_full.json'; // 包含所有卡片的配置
const TARGET_CONFIG_PATH = '.../form_config_single.json'; // 仅包含目标卡片的配置
const ACTIVE_CONFIG_PATH = '.../form_config.json'; // 应用实际使用的配置路径

async function addSpecificCardToDesktop(cardType: string) {
  // 1. 动态替换配置文件
  try {
    let targetConfigContent = await fs.readTextSync(TARGET_CONFIG_PATH); // 读取单卡片配置
    await fs.writeTextSync(ACTIVE_CONFIG_PATH, targetConfigContent); // 写入当前配置
  } catch (error) {
    console.error('Failed to switch form config:', error);
    return;
  }

  // 2. 拉起卡片管理器
  let context: common.UIAbilityContext = ...; // 获取当前UIAbility的Context
  let want: Want = {
    action: 'action.form.add',
    parameters: {
      // 可以传递formId等参数,但管理器界面仍由配置文件决定
    }
  };
  await context.startAbility(want);

  // 3. (可选) 延迟一段时间后恢复完整配置,或在下一次启动时恢复
  // setTimeout(async () => {
  //   let fullConfigContent = await fs.readTextSync(FULL_CONFIG_PATH);
  //   await fs.writeTextSync(ACTIVE_CONFIG_PATH, fullConfigContent);
  // }, 5000);
}

注意事项:

  • 文件操作:确保应用有权限读写目标配置文件路径(通常是在应用沙箱内)。
  • 配置一致性:动态修改配置可能会带来复杂的状态管理问题,请确保在应用生命周期的合适时机(如应用启动时)恢复为完整配置,避免影响应用内其他依赖卡片列表的功能。
  • 用户体验:此方法会在后台切换配置文件,对用户无感知,能达到仅展示目标卡片的效果。

目前没有通过openFormManager参数直接过滤卡片类型的方式。上述动态配置方案是实现该需求的有效工程解决方法。

回到顶部