Ability是鸿蒙应用提供能力的一种抽象。Ability又分为:FA(Feature Ability)和PA(Particle Ability)两种。Feature Ability支持Page Ability,那什么是Page Ability呢? 其实就是你所看到的各个界面,每个界面都是一个Page Ability.如果把整个app比作一个商场,那Page Ability就是每一个店面,里面可以用来陈列各种商品.
认识默认创建的Ability类super.onStart(intent);
: 调用父类的onStart,默认写法,也必须调用super.setMainRoute(MainAbilitySlice.class.getName());
: 加载Slice类,界面显示的主体在Slice类中.
super.onStart(intent);
: 调用父类的onStart,默认写法,也必须调用super.setUIContent(ResourceTable.Layout_ability_main);
: 加载布局文件,“布局文件”相当于是设计稿,加载的动作相当于把设计稿变成现实.
所有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
- 添加一个文字控件(Text)
完整代码如下:
效果图: 2. 改变布局方式,从纵向排列改成横向排列 修改DirectionalLayout中ohos:orientation属性值为
horizontal
,完整如下:
效果图:
- 在此之前,需要给每个需要操控的控件设置一个唯一的id 通过
ohos:id
指定,格式为:ohos:id="$+id:自定义控件ID"
,样例如:ohos:id="$+id:text1"
- 在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>Empty Page Ability(Java)”
- 在窗口中设置Ability名称,对应布局文件名称.
- 创建后的代码工程截图如下
- 修改对应布局文件:ability_main2.xml
- 修改一下第一个页面:ability_main.xml
下面演示点击“跳转”按钮时,从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发送数据 通过调用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);
}
);
}
}
- 目标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);
}
}
- 效果图
https://gitee.com/hspbc/harmonyos_demos/tree/master/pageAbilityDemo
零基础系列《零基础学安卓编程》 《零基础学Java编程》 《零基础学鸿蒙编程》
关于我厦门大学计算机专业 | 前华为工程师 专注《零基础学编程系列》,包含:Java | 安卓 | 前端 | Flutter | iOS | 小程序 | 鸿蒙 全网可关注:花生皮编程