文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

鸿蒙应用开发入门(六):页面间跳转

2024-12-03 14:20

关注

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

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

https://harmonyos.51cto.com/

1. 认识Intent

Intent是对象之间传递信息的载体。

例如,当一个Ability需要启动另一个Ability时,或者一个AbilitySlice需要导航到另一个AbilitySlice时,可以通过Intent指定启动的目标同时携带相关数据。Intent的构成元素包括Operation与Parameters:

2. 了解AbilitySlice路由配置

虽然一个Page可以包含多个AbilitySlice,但是Page进入前台时界面默认只展示一个AbilitySlice。默认展示的AbilitySlice是通过setMainRoute()方法来指定的。当有多个需要展示的AbilitySlice,可以通过addActionRoute()方法为MainAbilitySlice以外的AbilitySlice配置路由规则。此时,当其他Page实例期望导航到这些AbilitySlice时,可以通过AbilitySlice之间的跳转,显示出这张页面。

  1. public class MyAbility extends Ability { 
  2.  
  3. @Override 
  4.  
  5. public void onStart(Intent intent) { 
  6.  
  7. super.onStart(intent); 
  8.  
  9. // set the main route 
  10.  
  11. setMainRoute(MainSlice.class.getName()); 
  12.  
  13. // set the action route 
  14.  
  15. addActionRoute("action.pay", PaySlice.class.getName()); 
  16.  
  17. addActionRoute("action.scan", ScanSlice.class.getName()); 
  18.  
  19.  

 addActionRoute()方法中使用的动作命名,需要在应用配置文件(config.json)中注册:

  1.  
  2. "module": { 
  3.  
  4. "abilities": [ 
  5.  
  6.  
  7. "skills":[ 
  8.  
  9.  
  10. "actions":[ 
  11.  
  12. "action.pay"
  13.  
  14. "action.scan" 
  15.  
  16.  
  17.  
  18.  
  19. ... 
  20.  
  21.  
  22.  
  23. ... 
  24.  
  25.  
  26. ... 
  27.  

 3. 同一个Page里的AbilitySlice1与AbilitySlice2间的跳转(无参,带参,回值)

1)无参数跳转

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. Intent intent1 = new Intent(); 
  14.  
  15. present(new MainAbilitySlice1(),intent1); 
  16.  
  17. }); 
  18.  

 2)带参数跳转

(1)产生参数端的AbilitySlice

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. //有参数跳转 
  14.  
  15. Intent intent1 = new Intent(); 
  16.  
  17. intent1.setParam("user","钟发发"); 
  18.  
  19. present(new MainAbilitySlice1(),intent1); 
  20.  
  21. }); 
  22.  

 (2)接收参数端的AbilitySlice

  1. public class MainAbilitySlice1 extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. String oldText; 
  6.  
  7. @Override 
  8.  
  9. public void onStart(Intent intent) { 
  10.  
  11. super.onStart(intent); 
  12.  
  13. super.setUIContent(ResourceTable.Layout_ability_main1); 
  14.  
  15. text = (Text) findComponentById(ResourceTable.Id_text_helloworld1); 
  16.  
  17. if(intent != null){ 
  18.  
  19. String user = intent.getStringParam("user"); 
  20.  
  21. oldText = text.getText(); 
  22.  
  23. text.append("," + user); 
  24.  
  25.  
  26.  
  27. @Override 
  28.  
  29. protected void onInactive() { 
  30.  
  31. super.onInactive(); 
  32.  
  33.  
  34. .... 
  35.  

 3)带参数跳转+返回值

(1)参数产生端

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3. @Override 
  4.  
  5. public void onStart(Intent intent) { 
  6.  
  7. super.onStart(intent); 
  8.  
  9. super.setUIContent(ResourceTable.Layout_ability_main); 
  10.  
  11. Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  12.  
  13. text.setClickedListener(component->{ 
  14.  
  15. //有参数跳转 
  16.  
  17. Intent intent1 = new Intent(); 
  18.  
  19. intent1.setParam("user","钟发发"); 
  20.  
  21. presentForResult(new MainAbilitySlice1(),intent1,120); 
  22.  
  23. }); 
  24.  
  25.  
  26. ... 
  27.  

 (2)参数接收端

  1. public class MainAbilitySlice1 extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. String oldText; 
  6.  
  7. @Override 
  8.  
  9. public void onStart(Intent intent) { 
  10.  
  11. super.onStart(intent); 
  12.  
  13. super.setUIContent(ResourceTable.Layout_ability_main1); 
  14.  
  15. text = (Text) findComponentById(ResourceTable.Id_text_helloworld1); 
  16.  
  17. if(intent != null){ 
  18.  
  19. String user = intent.getStringParam("user"); 
  20.  
  21. oldText = text.getText(); 
  22.  
  23. text.setText(oldText + "," + user); 
  24.  
  25.  
  26. //参数接收端在对文字点击 
  27.  
  28. text.setClickedListener(component -> { 
  29.  
  30. //1.给跳转来的页面返回值 
  31.  
  32. Intent intent1 = new Intent(); 
  33.  
  34. intent1.setParam("password","123456"); 
  35.  
  36. setResult(intent1); 
  37.  
  38. //2.接收本AbilityAlice,自动返回上一页 
  39.  
  40. terminate(); 
  41.  
  42. }); 
  43.  
  44.  
  45. @Override 
  46.  
  47. protected void onInactive() { 
  48.  
  49. super.onInactive(); 
  50.  
  51. text.setText(oldText); 
  52.  
  53.  
  54. ... 
  55.  

 (3)回到参数产生端接收返回值

  1. public class MainAbilitySlice extends AbilitySlice { 
  2.  
  3. Text text; 
  4.  
  5. @Override 
  6.  
  7. public void onStart(Intent intent) { 
  8.  
  9. super.onStart(intent); 
  10.  
  11. super.setUIContent(ResourceTable.Layout_ability_main); 
  12.  
  13. text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  14.  
  15. text.setClickedListener(component->{ 
  16.  
  17. //有参数跳转 
  18.  
  19. Intent intent1 = new Intent(); 
  20.  
  21. intent1.setParam("user","钟发发"); 
  22.  
  23. presentForResult(new MainAbilitySlice1(),intent1,120); 
  24.  
  25. }); 
  26.  
  27.  
  28. @Override 
  29.  
  30. protected void onResult(int requestCode, Intent resultIntent) { 
  31.  
  32. super.onResult(requestCode, resultIntent); 
  33.  
  34. if(requestCode==120){ 
  35.  
  36. String password = resultIntent.getStringParam("password"); 
  37.  
  38. text.setText("返回值:" + password); 
  39.  
  40.  
  41.  
  42. ... 
  43.  

 4. 不同的Page直接跳转,第一个鸿蒙应用例子写的就是这个,核心代码:

  1. if (button != null) { 
  2.  
  3. // 为按钮设置点击回调 
  4.  
  5. button.setClickedListener(new Component.ClickedListener() { 
  6.  
  7. @Override 
  8.  
  9. public void onClick(Component component) { 
  10.  
  11. Intent secondIntent = new Intent(); 
  12.  
  13. // 指定待启动FA的bundleName和abilityName 
  14.  
  15. Operation operation = new Intent.OperationBuilder() 
  16.  
  17. .withDeviceId(""
  18.  
  19. .withBundleName("com.example.myapplication"
  20.  
  21. .withAbilityName("com.example.myapplication.SecondAbility"
  22.  
  23. .build(); 
  24.  
  25. secondIntent.setOperation(operation); 
  26.  
  27. startAbility(secondIntent); // 通过AbilitySlice的startAbility接口实现启动另一个页面 
  28.  
  29.  
  30. }); 
  31.  

 5. Page1的MainAbilitySlice跳转Page2的AbilitySlice1

  1. @Override 
  2.  
  3. public void onStart(Intent intent) { 
  4.  
  5. super.onStart(intent); 
  6.  
  7. super.setUIContent(ResourceTable.Layout_ability_main); 
  8.  
  9. text = (Text)findComponentById(ResourceTable.Id_text_helloworld); 
  10.  
  11. text.setClickedListener(component->{ 
  12.  
  13. Intent intent1 = new Intent(); 
  14.  
  15. intent1.setAction("abilityslice1"); //关键是配置文件里配置action和Ability里注册路由 
  16.  
  17. startAbility(intent1); 
  18.  
  19. }); 
  20.  

 文章内容已录制成视频课程《鸿蒙手机应用开发入门》https://edu.51cto.com/course/26133.html

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任

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

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

https://harmonyos.51cto.com/

 

来源:鸿蒙社区内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯