五华为鸿蒙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组件使用

四华为鸿蒙HarmonyOS应用开发之Java开发下Page Ability生命周期

鸿蒙HarMonyOS的自定义组件之五星好评