HarmonyOS 鸿蒙Next应用内拉起添加桌面卡片问题

HarmonyOS 鸿蒙Next应用内拉起添加桌面卡片问题 应用内拉起添加桌面卡片时,模态框内的卡片能只展示我想选中的卡片类型吗?需要怎样传参?

默认拉起会将项目中所有的卡片都拉起,通过轮播图进行选择,需要怎么处理?

cke_3801.png


更多关于HarmonyOS 鸿蒙Next应用内拉起添加桌面卡片问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

开发者您好,问题描述中“模态框内的卡片能只展示我想选中的卡片类型”,您这边想选中的卡片类型是展示一个单独的卡片还是说需要展示一组卡片(非全部卡片)能够在模态框中进行选择。

如果是需要选择到自己需要跳转的卡片而不是通过滑动轮播图才能进行选择,可以参考以下方案:

方案一:

调用formProvider.openFormManager接口,拉起卡片管理页面,将卡片添加至桌面。 formProvider.openFormManager接口根据传入的want参数,拉起卡片管理页面并优先显示参数对应的卡片。若want参数错误,则无法拉起卡片管理页面;若want参数的parameters字段不完整或指定的卡片不存在,则默认展示form_config.json中配置的默认卡片。

  • want参数需包含字段包括:
    • bundleName:卡片所属应用的包名。
    • abilityName:卡片所属的ability名称。
    • parameters:展示卡片的参数,详见下文。
  • parameters需包含的字段包括:
    • ohos.extra.param.key.form_dimension:卡片尺寸,参考FormDimension
    • ohos.extra.param.key.form_name:卡片名称,即form_config.json中卡片对应的name。
    • ohos.extra.param.key.module_name:卡片所属的模块名称。

示例代码如下:

import { formProvider } from '@kit.FormKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { Want } from '@kit.AbilityKit';
import { promptAction } from '@kit.ArkUI';
import { hilog } from '@kit.PerformanceAnalysisKit';

const DOMAIN = 0x0000;

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        // 添加拉起卡片管理页面按钮
        Button('添加卡片')
          .onClick(() => {
            const want: Want = {
              bundleName: 'com.example.myapplication', // 包名
              abilityName: 'EntryFormAbility', // 模块ability名称
              parameters: {
                'ohos.extra.param.key.form_dimension': 2, // 卡片尺寸
                'ohos.extra.param.key.form_name': 'widget', // 卡片名称
                'ohos.extra.param.key.module_name': 'entry' // 卡片所属的模块名称
              },
            };
            try {
              // 点击按钮后调用openFormManager方法,拉起卡片管理页面
              formProvider.openFormManager(want);
            } catch (error) {
              promptAction.openToast({ message: (error as BusinessError).message });
              hilog.info(DOMAIN, 'testTag', 'catch error ', 'code:', (error as BusinessError).code, 'message:',
                (error as BusinessError).message);
            }
          })
          .margin({ top: 10, bottom: 10 });
      }
      .width('100%');
    }
    .height('100%');
  }
}

方案二:

使用FormMenu组件,通过长按组件弹出“添加至桌面”菜单,将卡片添加至桌面。 以Menu组件为菜单容器,通过AddFormMenuItem添加菜单子项,根据AddFormMenuItem中传入的参数want,将指定的卡片添加至桌面,添加时会根据传入的组件ID获取组件快照和位置,用于添加桌面时的过渡动效。若want参数或组件ID错误、指定的卡片不存在或未在form_config.json中配置,则无法将卡片添加至桌面。

  • want参数需包含字段包括:
    • bundleName:卡片所属应用的包名。
    • abilityName:卡片所属的ability名称。
    • parameters:展示卡片的参数,详见下文。
  • parameters需包含的字段包括:
    • ohos.extra.param.key.form_dimension:卡片尺寸,参考FormDimension
    • ohos.extra.param.key.form_name:卡片名称,即form_config.json中卡片对应的name。
    • ohos.extra.param.key.module_name:卡片所属的模块名称。

示例代码如下:

import { AddFormMenuItem } from '@kit.ArkUI';
import { formBindingData } from '@kit.FormKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const tag = 'AddFormMenuItem';

@Entry
@Component
struct FormMenuDemo {
  private compId: string = 'addforms@d46313145';

  @Builder
  MyMenu() {
    Menu() {
      AddFormMenuItem(
        {
          bundleName: 'com.example.myapplication', // 包名
          abilityName: 'EntryFormAbility', // 模块ability名称
          parameters: {
            'ohos.extra.param.key.form_dimension': 2, // 卡片尺寸
            'ohos.extra.param.key.form_name': 'widgetImage', // 卡片名称
            'ohos.extra.param.key.module_name': 'entry' // 卡片所属的模块名称
          },
        },
        this.compId,
        {
          formBindingData: formBindingData.createFormBindingData({}),
          callback: (error, formId) => {
            hilog.info(0x3900, tag, `callback info:error = ${JSON.stringify(error)}, formId = ${formId}`);
            if (error?.code === 0) {
              hilog.info(0x3900, tag, '添加至桌面成功');
            } else {
              hilog.info(0x3900, tag, '添加至桌面失败,请尝试其它添加方式');
            }
          }
        }
      );
    };
  }

  build() {
    Row() {
      Column({ space: 36 }) {
        Text('长按图片添加卡片到桌面')
          .fontSize('18fp');

        Image($r('app.media.startIcon')) // 自定义图片
          .id(this.compId)
          .width(150)
          .height(150)
          // 绑定菜单
          .bindContextMenu(this.MyMenu, ResponseType.LongPress, {
            placement: Placement.TopLeft
          });
      }
      .width('100%');
    }
    .height('100%');
  }
}

您看下以上方案能否满足您当前的开发诉求,如果都不能满足请反馈,可以提供一下您需要的场景的更加完整的步骤。

更多关于HarmonyOS 鸿蒙Next应用内拉起添加桌面卡片问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


鸿蒙Next应用内拉起添加桌面卡片通过FormExtensionAbility实现。开发者需在module.json5中配置extensionAbilities,声明formEnabled为true并指定metadata。卡片使用ArkTS语言开发,通过FormProvider的setFormNextRefreshTime方法管理刷新。调用方使用startAbilityForResult发起添加请求,传递formId等参数。系统会弹出添加确认界面,用户确认后卡片将添加到桌面。

在HarmonyOS Next中,应用内拉起添加桌面卡片时,可以通过onAddForm回调的want参数来精确控制模态框中显示的卡片类型。

核心方法:EntryAbilityonAddForm生命周期回调中,系统会传入一个want参数。你可以通过解析want中的特定参数(例如formName)来判断并筛选出需要展示的卡片。

实现步骤:

  1. config.json中为每种卡片类型配置独立的formName。这是区分不同卡片的关键标识。
  2. EntryAbility中重写onAddForm方法。在此方法中,你可以从传入的want参数中获取formName
  3. 根据formName进行逻辑判断。系统会为每种卡片类型单独调用一次onAddForm。你可以在此决定是否为该次调用返回有效的卡片信息(FormBindingData)。
    • 如果当前formName是你希望展示的卡片类型,则正常创建并返回FormBindingData
    • 如果不是你希望展示的类型,你可以选择返回null或一个错误状态。这样,在用户拉起的添加卡片模态框中,就只会出现你允许添加的卡片类型。

代码示例:

// EntryAbility.ts
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { FormBindingData, formInfo } from '@kit.FormKit';

export default class EntryAbility extends UIAbility {
  // ...

  onAddForm(want: Want): formInfo.FormBindingData | null {
    // 1. 从want中获取要添加的卡片标识
    let formName = want.parameters?.['ohos.extra.param.key.form_name'] as string;

    // 2. 判断是否为允许添加的卡片类型
    if (formName === 'YourTargetWidgetName') { // 替换为你的目标卡片formName
      // 3. 创建并返回该卡片的绑定数据
      let formData: Record<string, Object> = {
        'title': '这是我想展示的卡片'
      };
      return FormBindingData.createFormBindingData(formData);
    }

    // 4. 对于不希望展示的卡片类型,返回null
    return null;
  }
}

效果: 通过上述逻辑,当用户在应用内触发“添加到桌面”或类似操作时,系统弹出的选择模态框将只包含formName'YourTargetWidgetName'的卡片,而不会轮播显示项目中的所有卡片。

关键点总结:

  • 控制逻辑写在EntryAbilityonAddForm生命周期中。
  • 使用want.parameters['ohos.extra.param.key.form_name']获取当前请求的卡片标识。
  • 通过判断该标识,决定是否创建(返回FormBindingData)或忽略(返回null)该次卡片添加请求,从而实现过滤。

这样,你便可以实现只展示特定卡片类型的需求,无需用户在所有卡片中轮播查找。

回到顶部