HarmonyOS编程页面跳转 | Java注释版

开发 前端 OpenHarmony
文章由鸿蒙社区产出,想要了解更多内容请前往:51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

[[406839]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前言

这里有HarmonyOS文档学习 | Page Ability | 思维导图,是关于文档部分的思维导图,页面跳转也是要到里面的知识

本文章只是说明书,是代码的补充部分。不建议仅根据该文进行实践

正确的做法是下载附件中的源码,对照源码和文章的步骤,进行实践复现

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

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

正文

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

1.1. 基本实验步骤

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

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

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

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

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.  
  6.     Text text = (Text) findComponentById(ResourceTable.Id_ability_text_2);  // 获得text组件 
  7.     // getStringParam(),从inent中通过键获取值,因为是键值对形式;返回的结果为"鸿蒙,你好" 
  8.     text.setText(intent.getStringParam("data"));    // 修改text组件的内容,会覆盖原来的内容 
  9.  

 在主页面设置参数存入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.  
  6.    // 通过组件id获取组件 
  7.    Text text = (Text) findComponentById(ResourceTable.Id_ability_text_3); 
  8.    text.setClickedListener(component -> { 
  9.       Intent intent1 = new Intent(); 
  10.       intent1.setParam("pwd""51cto");  // 设置参数 
  11.       setResult(intent1);    // 设置返回的结果 
  12.       terminate();   // 点击事件结束后销毁该slice 
  13.    }); 
  14.  

 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.     } 

 调用流程如下所示

 

结果

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区
HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

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

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

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

2.1 基本实验步骤

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

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

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

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

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

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. }); 

结果

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

2.2.2. 通过 setAction() 方式

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

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

第二步:在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.  
  7.        // 第一个参数为:config.json中声明的actions;第二个参数为:要跳转目标Slice的路径名 
  8.       super.addActionRoute("abilityslice2", SecondPageSlice.class.getName()); 
  9.    } 
HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

第三步:在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. }); 

结果

HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区
HarmonyOS编程 | 页面跳转 | Java注释版-鸿蒙HarmonyOS技术社区

3. 总结

3.1. 同页面跳转

默认:

  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()方式,因为这种方式在跨设备调用还需要用。习惯这一种就好了

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-06-23 15:48:08

鸿蒙HarmonyOS应用

2021-09-18 14:45:26

鸿蒙HarmonyOS应用

2021-01-05 10:35:04

鸿蒙HarmonyOS应用开发

2021-05-18 09:49:08

鸿蒙HarmonyOS应用

2009-12-24 17:57:53

WPF页面跳转

2009-07-02 09:25:41

JSP实现页面跳转

2012-04-19 16:41:24

Titanium视频实现页面跳转

2010-08-05 09:39:17

Flex页面跳转

2009-12-16 17:24:26

Ruby on Rai

2009-07-01 18:08:18

JSP页面跳转

2011-05-11 16:54:49

JSP

2009-12-11 13:25:01

PHP页面跳转

2009-07-03 17:24:31

Servlet页面跳转

2009-02-17 10:40:26

页面跳转JSP教程

2011-04-07 10:50:47

数据库编程注释规范

2010-08-05 09:33:08

Flex页面跳转

2010-08-13 13:25:53

Flex页面跳转

2015-05-05 10:51:32

php页面跳转方法

2009-07-03 18:32:18

JSP页面跳转

2021-08-23 10:49:02

鸿蒙HarmonyOS应用
点赞
收藏

51CTO技术栈公众号