五华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递回值详解
Posted 皓月盈江
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递回值详解相关的知识,希望对你有一定的参考价值。
同一Page内导航
当发起导航的AbilitySlice和导航目标的AbilitySlice处于同一个Page时,您可以通过present()方法实现导航。如下代码片段展示通过点击按钮导航到其他AbilitySlice的方法:
@Override
protected void onStart(Intent intent) {
...
Button button = ...;
button.setClickedListener(listener -> present(new TargetSlice(), new Intent()));
...
}
如果开发者希望在用户从导航目标AbilitySlice返回时,能够获得其返回结果,则应当使用presentForResult()实现导航。用户从导航目标AbilitySlice返回时,系统将回调onResult()来接收和处理返回结果,开发者需要重写该方法。返回结果由导航目标AbilitySlice在其生命周期内通过setResult()进行设置。
@Override
protected void onStart(Intent intent) {
...
Button button = ...;
button.setClickedListener(listener -> presentForResult(new TargetSlice(), new Intent(), 0));
...
}
@Override
protected void onResult(int requestCode, Intent resultIntent) {
if (requestCode == 0) {
// Process resultIntent here.
}
}
系统为每个Page维护了一个AbilitySlice实例的栈,每个进入前台的AbilitySlice实例均会入栈。当开发者在调用present()或presentForResult()时指定的AbilitySlice实例已经在栈中存在时,则栈中位于此实例之上的AbilitySlice均会出栈并终止其生命周期。前面的示例代码中,导航时指定的AbilitySlice实例均是新建的,即便重复执行此代码(此时作为导航目标的这些实例是同一个类),也不会导致任何AbilitySlice出栈。
//====================================================================
实例测试:
1.首先按照二、华为鸿蒙开发DevEco Studio运行第一个Hello World工程
创建Empty Ability(Java)的HelloWorld工程,运行如下图:
2.同一个 Page 里跳转
同一个 Page 里的 AbilitySlice1 与 AbilitySlice2 间的跳转(无参,带参,回值)。
2.1无参数跳转
想实现点击“你好,世界”文字,同一个 Page 里实现页面跳转后,显示“目标测试”文字,过程进行无参传递
(1).复制layout文件夹下的ability_main.xml文件,在layout文件夹上粘贴把文件重命名为ability_TargetSlice.xml
(2).修改ability_TargetSlice.xml文件内Text的id和文本内容.
(3).类似方法把Slice文件下的MainAbilitySlice.java复制粘贴重命名为TargetAbilitySlice.java
在onStart方法中修改设置UI入口:
super.setUIContent(ResourceTable.Layout_ability_TargetSlice);
(4).在MainAbilitySlice.java文件添加代码,获取文本,设置文本的点击事件
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//获取文本ID
Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
//设置文本的点击监听事件
text.setClickedListener(component -> present(new TargetAbilitySlice(), new Intent()));
}
(5).运行程序,检验效果如下:
2.2有参数跳转
想实现点击“你好,世界”文字,同一个 Page 里实现页面跳转后,显示“目标测试”文字后面添加“哆啦A梦”
(1).在MainAbilitySlice.java文件添加代码,获取文本,设置文本的点击事件
产生参数端的 MainAbilitySlice.java:
package com.example.helloword.slice;
import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class MainAbilitySlice extends AbilitySlice {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//获取文本ID
Text text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
//设置文本的点击监听事件
text.setClickedListener(component -> {
Intent intent1 = new Intent();
intent1.setParam("user","哆啦A梦");
present(new TargetAbilitySlice(), intent1);
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
接收参数端的 ability_TargetSlice.java:
package com.example.helloword.slice;
import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class TargetAbilitySlice extends AbilitySlice {
String oldText;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_TargetSlice);
Text text = (Text) findComponentById(ResourceTable.Id_text_TargetSlice);
if(intent != null){
String user = intent.getStringParam("user");
oldText = text.getText();
text.append("," + user);
}
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
(2).运行测试效果:
2.3带参数跳转+返回值
想实现点击“你好,世界”文字,同一个 Page 里实现页面跳转后,显示“目标测试”文字后面添加“哆啦A梦”
,再次点击“目标测试哆啦A梦”文字后,返回到上一页面,显示“返回值:123456”
(1).
参数产生端:
package com.example.helloword.slice;
import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class MainAbilitySlice extends AbilitySlice {
Text text;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//获取文本ID
text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
//设置文本的点击监听事件
text.setClickedListener(component -> {
Intent intent1 = new Intent();
intent1.setParam("user","哆啦A梦");
presentForResult(new TargetAbilitySlice(), intent1,0);
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
参数接收端:
package com.example.helloword.slice;
import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class TargetAbilitySlice extends AbilitySlice {
Text text;
String oldText;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_TargetSlice);
text = (Text) findComponentById(ResourceTable.Id_text_TargetSlice);
if(intent != null){
String user = intent.getStringParam("user");
oldText = text.getText();
text.append("," + user);
}
//参数接收端在对文字点击
text.setClickedListener(component -> {
//1.给跳转来的页面返回值
Intent intent1 = new Intent();
intent1.setParam("password","123456");
setResult(intent1);
//2.接收本AbilityAlice,自动返回上一页
terminate();
});
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
回到参数产生端接收返回值:
package com.example.helloword.slice;
import com.example.helloword.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.Text;
public class MainAbilitySlice extends AbilitySlice {
Text text;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
//获取文本ID
text = (Text)findComponentById(ResourceTable.Id_text_helloworld);
//设置文本的点击监听事件
text.setClickedListener(component -> {
Intent intent1 = new Intent();
intent1.setParam("user","哆啦A梦");
presentForResult(new TargetAbilitySlice(), intent1,0);
});
}
@Override
protected void onResult(int requestCode, Intent resultIntent) {
super.onResult(requestCode, resultIntent);
if(requestCode==0){
String password = resultIntent.getStringParam("password");
text.setText("返回值:" + password);
}
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
(2).运行程序,效果如下图:
欢迎关注公众号,方便技术交流
以上是关于五华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递回值详解的主要内容,如果未能解决你的问题,请参考以下文章
六华为鸿蒙HarmonyOS应用开发之Java开发模式下的不同Page 间实现页面跳转
十华为鸿蒙HarmonyOS应用开发之Java UI框架常用TabList组件使用
八华为鸿蒙HarmonyOS应用开发之Java UI框架常用TextField组件使用
七华为鸿蒙HarmonyOS应用开发之Java UI框架常用Text组件和Button组件使用