鴻蒙OS Ability Form

2020-09-18 10:14 更新

基本概念

Ability Form,即表單,是 Page 形態(tài)的 Ability 的一種界面展示形式,用于嵌入到其他應(yīng)用中作為其界面的一部分顯示,并支持基礎(chǔ)的交互功能。表單使用方作為表單展示的宿主負責(zé)顯示表單,表單使用方的典型應(yīng)用就是桌面。下圖展示一種音樂播放應(yīng)用 Page 的完整顯示及其微縮展示效果。

圖1 Page 及其表單 img

表單提供方

表單提供方是一個 Page 形態(tài)的 Ability,需要實現(xiàn) onCreateForm() 方法,并返回一個 AbilityForm 對象。創(chuàng)建 AbilityForm 對象時需要指定表單布局文件。

  1. 為表單定義布局文件。創(chuàng)建布局文件form_layout.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionLayout xmlns:ohos="http://schemas.huawei.com/res/ohos"
  3. ohos:width="match_parent"
  4. ohos:height="match_parent"
  5. ohos:orientation="horizontal">
  6. <Text
  7. ohos:id="$+id:text01"
  8. ohos:width="match_content"
  9. ohos:height="match_content"
  10. ohos:text="Counter"
  11. ohos:text_color="#FF555555"
  12. ohos:text_size="20fp"/>
  13. <Text
  14. ohos:id="$+id:text02"
  15. ohos:width="match_content"
  16. ohos:height="match_content"
  17. ohos:text_color="#FF0000FF"
  18. ohos:text_size="20fp"/>
  19. </DirectionLayout>

  1. 實現(xiàn) onCreateForm() 方法,并為表單視圖控件注冊回調(diào)。

  1. public class FormAbility extends Ability {
  2. private static AbilityForm abilityForm;
  3. private static int clickTimes = 0;
  4. ...
  5. @Override
  6. public AbilityForm onCreateForm() {
  7. abilityForm = new AbilityForm(ResourceTable.Layout_form_layout, this);
  8. abilityForm.setText(ResourceTable.Id_text02, generateFormText());
  9. abilityForm.registerViewListener(ResourceTable.Id_text02, new OnClickListener() {
  10. @Override
  11. public void onClick(int viewId, AbilityForm form, ViewsStatus viewsStatus) {
  12. clickTimes++;
  13. form.setText(viewId, generateFormText());
  14. if (FormSlice.text != null) {
  15. FormSlice.text.setText("Client.Counter: " + clickTimes);
  16. }
  17. }
  18. });
  19. return abilityForm;
  20. }
  21. private static String generateFormText() {
  22. return "total: " + clickTimes;
  23. }
  24. }

  1. 在 FormSlice 實現(xiàn) text,用于展示 Form 點擊效果(用例展示效果,非實現(xiàn) Form 必須步驟)。

  1. public class FormSlice extends AbilitySlice {
  2. public static Text text;
  3. @Override
  4. public void onStart(Intent intent) {
  5. super.onStart(intent);
  6. PositionLayout positionLayout = new PositionLayout(this);
  7. ShapeElement background = new ShapeElement();
  8. background.setShape(ShapeElement.RECTANGLE);
  9. background.setRgbColor(new RgbColor(0xFFFFFFFF));
  10. positionLayout.setBackground(background);
  11. text = new Text(this);
  12. text.setTextSize(30);
  13. text.setTop(400);
  14. text.setLeft(200);
  15. text.setText(assembleText(FormAbility.getClickTimes()));
  16. positionLayout.addComponent(text);
  17. super.setUIContent(positionLayout);
  18. }
  19. ...
  20. }

  1. 表單提供方在配置文件中聲明,將 form-enabled 設(shè)置為 true ,并提供表單尺寸信息。

  1. {
  2. "module": {
  3. ...
  4. "abilities": [
  5. {
  6. ...
  7. "form-enabled": true,
  8. "form": {
  9. "default-height": 200,
  10. "default-width": 300,
  11. "min-height": 60,
  12. "min-width": 80
  13. },
  14. ...
  15. }
  16. ]
  17. ...
  18. }
  19. ...
  20. }

說明

由于當(dāng)前暫未支持 Form 縮放,即無法調(diào)整其顯示尺寸,因此 min-height 和 min-width 字段暫無實際用途,可以省略。

表單使用方

表單使用方通常是桌面類應(yīng)用。以下示例展示如何獲取并展示表單。

  1. 獲取表單需要具有 ohos.permission.REQUIRE_FORM 權(quán)限,注意該權(quán)限僅限系統(tǒng)應(yīng)用獲取。在配置文件中聲明需要此權(quán)限。

  1. "reqPermissions": [
  2. {
  3. "name": "ohos.permission.REQUIRE_FORM"
  4. }
  5. ]

  1. 調(diào)用 AbilitySlice 類的 acquireAbilityFormAsync() 方法異步獲取表單,該方法需要通過 Intent 指定獲取的目標(biāo)表單,并提供一個回調(diào)用于接收表單。注意,獲取到 AbilityForm 實例并未立即顯示到當(dāng)前頁面布局中,開發(fā)者需要繼續(xù)后續(xù)步驟把表單添加到視圖中才會顯示。

  1. private void acquireForm() throws RemoteException {
  2. Intent intent = new Intent();
  3. Operation operation = new Intent.OperationBuilder()
  4. .withDeviceId("")
  5. .withBundleName("ohos.formsupplier.ability")
  6. .withAbilityName("ohos.formsupplier.ability.FormAbility")
  7. .build();
  8. intent.setOperation(operation);
  9. // Get form size.
  10. formAbilityInfo = getBundleManager().queryAbilityByIntent(intent,IBundleManager.GET_ABILITY_INFO_WITH_PERMISSION,userId).get(0);
  11. this.acquireAbilityFormAsync(intent, new AbilityForm.OnAcquiredCallback() {
  12. @Override
  13. public void onAcquired(AbilityForm abilityForm) {
  14. // store as a class field
  15. form = abilityForm;
  16. }
  17. @Override
  18. public void onDestroyed(AbilityForm abilityForm) {
  19. form = null;
  20. }
  21. });
  22. }

  1. 創(chuàng)建布局,作為表單的視圖容器。

  1. private PositionLayout createFormHostLayout() {
  2. PositionLayout formLayout = ...;
  3. ...
  4. // set size same with default of form
  5. formLayout.setHeight(formAbilityInfo.getDefaultFormHeight());
  6. formLayout.setWidth(formAbilityInfo.getDefaultFormWidth());
  7. ...
  8. return formLayout;
  9. }

  1. 將表單的視圖容器添加到當(dāng)前視圖中,以便顯示表單。

  1. private void showForm() {
  2. PositionLayout hostLayout = createFormHostLayout();
  3. // attach form to host layout
  4. hostLayout.addComponent(form.getView());
  5. // attach host layout to root layout
  6. rootLayout.addComponent(hostLayout);
  7. }

如果開發(fā)者需要移除表單,調(diào)用 AbilitySlice 類的 releaseAbilityForm() 方法,并以此前獲取的 AbilityFor 對象作為參數(shù)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號