您当前的位置: 首页 > 

蓝不蓝编程

暂无认证

  • 3浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

零基础学鸿蒙编程-Ability(Page Ability)

蓝不蓝编程 发布时间:2021-11-25 22:54:40 ,浏览量:3

什么是Ability

Ability是鸿蒙应用提供能力的一种抽象。Ability又分为:FA(Feature Ability)和PA(Particle Ability)两种。Feature Ability支持Page Ability,那什么是Page Ability呢? 其实就是你所看到的各个界面,每个界面都是一个Page Ability.如果把整个app比作一个商场,那Page Ability就是每一个店面,里面可以用来陈列各种商品.

认识默认创建的Ability类

  1. super.onStart(intent); : 调用父类的onStart,默认写法,也必须调用
  2. super.setMainRoute(MainAbilitySlice.class.getName());: 加载Slice类,界面显示的主体在Slice类中.
认识默认创建的Slice类

  1. super.onStart(intent); : 调用父类的onStart,默认写法,也必须调用
  2. super.setUIContent(ResourceTable.Layout_ability_main);: 加载布局文件,“布局文件”相当于是设计稿,加载的动作相当于把设计稿变成现实.
Ability注册

所有Ability都必须在config.json文件中注册(该文件位于entry/src/main目录下).

{
  "app": {
    "bundleName": "cn.hsp.myapplication.hmservice",
    "vendor": "hsp",
    "version": {
      "code": 1000000,
      "name": "1.0.0"
    }
  },
  "deviceConfig": {},
  "module": {
    "package": "cn.hsp.myapplication",
    "name": ".MyApplication",
    "mainAbility": "cn.hsp.myapplication.MainAbility",
    "deviceType": [
      "phone",
      "tablet",
      "tv",
      "wearable",
      "car"
    ],
    "distro": {
      "deliveryWithInstall": true,
      "moduleName": "entry",
      "moduleType": "entry",
      "installationFree": true
    },
    "abilities": [
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "visible": true,
        "name": "cn.hsp.myapplication.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "$string:entry_MainAbility",
        "type": "page",
        "launchType": "standard"
      }
    ]
  }
}

上述代码中abilities节点就是用来注册Ability的. 每个App都需要有一个启动入口,这个通过mainAbility来指定。

"mainAbility": "cn.hsp.myapplication.MainAbility"
Slice对应的布局文件ability_main.xml



    


给界面对应的布局文件添加更多视图
  1. 添加一个文字控件(Text)

完整代码如下:




    
    


效果图: 2. 改变布局方式,从纵向排列改成横向排列 修改DirectionalLayout中ohos:orientation属性值为horizontal,完整如下:




    

    


效果图:

在java代码里操控布局文件里的控件
  1. 在此之前,需要给每个需要操控的控件设置一个唯一的id 通过ohos:id指定,格式为:ohos:id="$+id:自定义控件ID",样例如:ohos:id="$+id:text1"



    

    


  1. 在java代码里给按钮控件添加点击事件 下面代码用于给按钮增加点击事件,new ToastDialog(getContext()).setText("哈哈1").show());用于显示一个短暂的提示消息.
findComponentById(ResourceTable.Id_text1).setClickedListener(component -> new ToastDialog(getContext()).setText("哈哈1").show());

完整代码:

public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        findComponentById(ResourceTable.Id_text1).setClickedListener(component -> new ToastDialog(getContext()).setText("哈哈1").show());
        findComponentById(ResourceTable.Id_text2).setClickedListener(component -> new ToastDialog(getContext()).setText("哈哈2").show());
    }
}

效果图:

手动创建Ability
  1. 在工程目录中单击右键,选择“新建>Ability>Empty Page Ability(Java)”
  2. 在窗口中设置Ability名称,对应布局文件名称.
  3. 创建后的代码工程截图如下
  4. 修改对应布局文件:ability_main2.xml



    


  1. 修改一下第一个页面:ability_main.xml



    


Ability跳转

下面演示点击“跳转”按钮时,从MainAbility跳转到Main2Ability:

public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        findComponentById(ResourceTable.Id_text1).setClickedListener(component ->
                {
                    Intent newIntent = new Intent();
                    Operation operation = new Intent.OperationBuilder()
                            .withBundleName("cn.hsp.harmonyosdemos")
                            .withAbilityName("cn.hsp.harmonyosdemos.MainAbility2")
                            .build();
                    newIntent.setOperation(operation);
                    startAbility(newIntent);
                }
        );
    }
}

效果图:

Ability带数据跳转
  1. 源Ability发送数据 通过调用intent的setParam方法传递数据
public class MainAbilitySlice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        findComponentById(ResourceTable.Id_text1).setClickedListener(component ->
                {
                    Intent newIntent = new Intent();
                    Operation operation = new Intent.OperationBuilder()
                            .withBundleName("cn.hsp.harmonyosdemos")
                            .withAbilityName("cn.hsp.harmonyosdemos.MainAbility2")
                            .build();
                    newIntent.setOperation(operation);
                    newIntent.setParam("name","花生皮编程");
                    newIntent.setParam("school","厦门大学");
                    newIntent.setParam("major","计算机科学与技术");
                    startAbility(newIntent);
                }
        );
    }
}
  1. 目标Ability接收数据
        String name = intent.getStringParam("name");
        String school = intent.getStringParam("school");
        String major = intent.getStringParam("major");

a) 修改一下目标界面,将数据展示出来.

  • 修改ability_main2.xml,添加显示数据的控件



    


b) 显示数据 接收及显示数据的完整代码:

public class MainAbility2Slice extends AbilitySlice {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main2);

        String name = intent.getStringParam("name");
        String school = intent.getStringParam("school");
        String major = intent.getStringParam("major");
        ((Text) findComponentById(ResourceTable.Id_text2)).setText("姓名:" + name + "\n学校:" + school + "\n专业:" + major);

    }
}
  1. 效果图
完整源代码

https://gitee.com/hspbc/harmonyos_demos/tree/master/pageAbilityDemo

零基础系列

《零基础学安卓编程》 《零基础学Java编程》 《零基础学鸿蒙编程》

关于我

厦门大学计算机专业 | 前华为工程师 专注《零基础学编程系列》,包含:Java | 安卓 | 前端 | Flutter | iOS | 小程序 | 鸿蒙 全网可关注:花生皮编程

关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0442s