当前位置:   article > 正文

HarmonyOS入门教程之页面跳转(Java版)

鸿蒙怎么用java实现页面跳转

页面跳转即AbilitySlice间导航。这部分有两种,一种是同Page里跳转,另一种是不同Page里跳转

下面将介绍这两种的实现方式

 

正文

 

1. 同Page跳转的三种实现方式

 

1.1. 基本实验步骤

1. 在layout文件夹中写xml布局文件

ability_main.xml是主页面,其他三个是要跳转到的页面,可以随便定义内容

2. 在slice中声明创建Slice文件声明调用layout布局文件

3. 在主Slice中,编写业务代码实现跳转(不同的方式实现区别主要在第3个步骤)

1.2. 核心代码部分

1.2.1. 无参跳转

MainAbilitySlice.java

  1. // 第一个按钮:实现基本的跳转
  2. // 通过xml布局文件中的组件ID获取组件
  3. Button btn_1 = (Button) findComponentById(ResourceTable.Id_btn_1);
  4. // 设置按钮点击监听事件,在点击时进行如下操作
  5. btn_1.setClickedListener(component -> { // lambda表达式
  6. Intent btn_1_intent = new Intent(); // Intent:意图,是对象之间传递信息的载体
  7. // 通过present进行跳转操作
  8. /**
  9. * 参数说明
  10. * new FirstAbilitySlice():表示要跳转到的slice
  11. * btn_1_intent:把信息载体作为参数传到对应slice中
  12. */
  13. present(new FirstAbilitySlice(), btn_1_intent);
  14. });

调用present()之后会直接跳转

 

1.2.2. 带参数跳转

大部分内容和第一个实现差不多,所以就不写注释了

MainAbilitySlice.java

  1. // 第二个按钮:实现带参数跳转;可以边跳转边传值改变内容
  2. Button btn_2 = (Button) findComponentById(ResourceTable.Id_btn_2);
  3. btn_2.setClickedListener(component -> {
  4. Intent btn_2_intent = new Intent();
  5. btn_2_intent.setParam("data", "鸿蒙,你好"); // 设置参数,形式是K:V结构,存在intent中
  6. present(new SecondAbilitySlice(), btn_2_intent);
  7. });

secondAbilitySlice.java

  1. @Override
  2. public void onStart(Intent intent) {
  3. super.onStart(intent);
  4. super.setUIContent(ResourceTable.Layout_ability_2);
  5. Text text = (Text) findComponentById(ResourceTable.Id_ability_text_2); // 获得text组件
  6. // getStringParam(),从inent中通过键获取值,因为是键值对形式;返回的结果为"鸿蒙,你好"
  7. text.setText(intent.getStringParam("data")); // 修改text组件的内容,会覆盖原来的内容
  8. }

在主页面设置参数存入intent中之后跳转,跳转到目标页面Slice后,读取inent中的参数,从而修改本来的内容

内容由 “第二个页面跳转实现” 变为 “鸿蒙,你好”

 

1.2.3. 带返回值跳转

(以下代码按步骤实现)

MainAbilitySlice.java

  1. // 第三个按钮:实现带返回值跳转;可以通过校验返回值,在onResult中实现校验通过后的其他行为
  2. text_main = (Text) findComponentById(ResourceTable.Id_text_main);
  3. Button btn_3 = (Button) findComponentById(ResourceTable.Id_btn_3);
  4. btn_3.setClickedListener(component -> {
  5. Intent btn_3_intent = new Intent();
  6. // 这是使用的是presentForResult()进行跳转,最后一个参数是请求代码,用于返回时校验
  7. presentForResult(new ThirdAbilitySlice(), btn_3_intent, 666);
  8. });

ThridAbilitySlice.java

  1. @Override
  2. public void onStart(Intent intent) {
  3. super.onStart(intent);
  4. super.setUIContent(ResourceTable.Layout_ability_3);
  5. // 通过组件id获取组件
  6. Text text = (Text) findComponentById(ResourceTable.Id_ability_text_3);
  7. text.setClickedListener(component -> {
  8. Intent intent1 = new Intent();
  9. intent1.setParam("pwd", "51cto"); // 设置参数
  10. setResult(intent1); // 设置返回的结果
  11. terminate(); // 点击事件结束后销毁该slice
  12. });
  13. }

MainAbilitySlice.java

  1. @Override
  2. protected void onResult(int requestCode, Intent resultIntent) {
  3. super.onResult(requestCode, resultIntent);
  4. // 如果请求代码校验通过,则执行一下的操作
  5. if (requestCode == 666) {
  6. // 获取pwd的值
  7. String pwd = resultIntent.getStringParam("pwd");
  8. // 在pwd的值,添加到原文本的后面
  9. text_main.append(" 密码:" + pwd);
  10. }
  11. }

调用流程如下所示

结果

点击获取密码后,会调用terminate()方法销毁页面。回到主页面同时调用onResult()方法,执行文字拼接

 

2. 不同Page跳转的两种实现方式

 

2.1 基本实验步骤

1. 新建Ability,同时DES会自动在layout和slice中创建新的文件

2. 在layout文件夹中写xml布局文件

3. 在slice中声明创建Slice文件声明调用layout布局文件

4. 在主Slice中,编写业务代码实现跳转

 

2.2. 核心代码部分

2.2.1. 通过 new Intent.OperationBuilder() 方式

MainAbilitySlice.java

  1. // 推荐使用这种方法实现!使用OperationBuilder()方法实现
  2. Button btn_4 = (Button) findComponentById(ResourceTable.Id_btn_4);
  3. btn_4.setClickedListener(component -> {
  4. Intent btn_4_intent = new Intent();
  5. Operation operation = new Intent.OperationBuilder()
  6. .withDeviceId("") // 设备Id,在本地上进行跳转可以为空,跨设备进行跳转则需要传入值
  7. .withBundleName("com.anzia.pagejump") // 包名
  8. .withAbilityName(".SecondAbility") // Ability页面的名称,在本地可以缺省前面的路径
  9. .build(); // 构建代码
  10. btn_4_intent.setOperation(operation); // 将operation存入到intent中
  11. startAbility(btn_4_intent); // 实现Ability跳转
  12. });

结果

2.2.2. 通过 setAction() 方式

第一步:在config中声明SecondAbility的actions

第二步:在SecondAbility中添加Action路由

  1. public class SecondAbility extends Ability {
  2. @Override
  3. public void onStart(Intent intent) {
  4. super.onStart(intent);
  5. super.setMainRoute(SecondPageSlice.class.getName());
  6. // 第一个参数为:config.json中声明的actions;第二个参数为:要跳转目标Slice的路径名
  7. super.addActionRoute("abilityslice2", SecondPageSlice.class.getName());
  8. }
  9. }


第三步:在MainAbilitySlice.java中实现不同页面跳转

  1. // 不推荐这个,挺麻烦的
  2. // 先去config.json中添加对应的action
  3. // 在Ability文件添加addActionRoute()路由
  4. // 在Slice文件中组件的监听事件设置跳转方法
  5. Button btn_5 = (Button) findComponentById(ResourceTable.Id_btn_5);
  6. btn_5.setClickedListener(component -> {
  7. Intent btn_5_intent = new Intent();
  8. btn_5_intent.setAction("abilityslice2");
  9. startAbility(btn_5_intent);
  10. });

结果

 3. 总结

 

3.1. 同页面跳转

默认:

// 直接调用present()方法

带参数:

  1. // 主页面
  2. intent.setParam()
  3. present()
  4. // 目标页面
  5. intent.getXXXParam()

等待返回值:

  1. // 主页面
  2. presentForResult()
  3. // 目标页面
  4. setResult()
  5. // 主页面
  6. 实现onResult()方法

3.2. 不同页面跳转

OperationBuilder()方式

  1. // 主页面
  2. Operation operation = new Intent.opationBuilder()
  3. .withDeviceId(设备id)
  4. .withBundleName(包名)
  5. .withAbilityName(FA名)
  6. .build();
  7. intent.setOparation(operation);
  8. startAbility(intent);

setAction()方式

  1. // 在config.json中声明actions
  2. // 在目标Ability中调用addActionRoute()方法添加路由
  3. super.addActionRoute();
  4. // 主页面
  5. intent.setAction(action名);
  6. startAbility(intent);

3.3. 差别

有present()、presentForResult()的是同页面跳转

有startAbility()的是不同页面跳转

 

不同页面跳转推荐使用OperationBuilder()方式,因为这种方式在跨设备调用还需要用。习惯这一种就好了

 

【abilityslice页面跳转.rar】是源码

https://harmonyos.51cto.com/resource/643

--完--

关注「HarmonyOS应用开发者」,一起学习成长

后台回复"教程" 获得最新鸿蒙开发者教程,助你快速上手鸿蒙开发!

花了半个月时间整理了522页的《HarmonyOS从入门到精通》电子书

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/274999
推荐阅读
相关标签
  

闽ICP备14008679号