HarmonyOS 鸿蒙Next如何实现类似Android的startActivityForResult效果

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next如何实现类似Android的startActivityForResult效果 我在A页面, 点击选择省份, 跳转到B页面, B页面里面省份选择完成后关闭并将选择的省份信息回传到A页面.

2 回复

可以参考下 UIAbilityContext.startAbilityForResult

如果使用 NavPathStackpushPathByName 的话,可以通过添加 onPop 回调函数来处理页面返回时的操作。当页面出栈时,onPop 回调会被触发,可以在回调中获取返回信息并进行处理。

参考文档:页面跳转

可以参考以下 demo:

// Index.ets

@Entry
@Component
struct NavigationExample {
  pageInfo: NavPathStack = new NavPathStack()

  build() {
    Navigation(this.pageInfo) {
      Column() {
        Button('StartTest', { stateEffect: true, type: ButtonType.Capsule })
          .width('80%')
          .height(40)
          .margin(20)
          .onClick(() => {
            this.pageInfo.pushPath({ name: 'pageOne' }); // 将name指定的NavDestination页面信息入栈。
          })
      }
    }.title('NavIndex')
  }
}
// PageOne.ets

import { BusinessError } from '@kit.BasicServicesKit';

class TmpClass{
  count:number = 10
}

class ParamWithOp {
  operation: number = 1
  count: number = 10
}

@Builder
export function PageOneBuilder(name: string, param: Object) {
  PageOne()
}

@Component
export struct PageOne {
  pageInfo: NavPathStack = new NavPathStack();
  @State message: string = 'Hello World'

  build() {
    NavDestination() {
      Column() {
        Text(this.message)
          .width('80%')
          .height(50)
          .margin(10)
        Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
          .width('80%')
          .height(40)
          .margin(10)
          .onClick(() => {
            let tmp = new TmpClass()
            this.pageInfo.pushPathByName('pageTwo', tmp, (popInfo)=>{
              this.message = '[pushPathByName]last page is: ' + popInfo.info.name + ', result: ' + JSON.stringify(popInfo.result);
            }); // 将name指定的NavDestination页面信息入栈,传递的数据为param,添加接收处理结果的onPop回调。
          })
      }.width('100%').height('100%')
    }.title('pageOne')
    .onBackPressed(() => {
      this.pageInfo.pop({number: 1}) // 弹出路由栈栈顶元素。
      return true
    }).onReady((context: NavDestinationContext) => {
      this.pageInfo = context.pathStack;
    })
  }
}
// PageTwo.ets

class resultClass {
  constructor(count: number) {
    this.count = count;
  }
  count: number = 10
}

@Builder
export function PageTwoBuilder() {
  PageTwo()
}

@Component
export struct PageTwo {
  pathStack: NavPathStack = new NavPathStack()

  build() {
    NavDestination() {
      Column() {
        Button('pop', { stateEffect: true, type: ButtonType.Capsule })
          .width('80%')
          .height(40)
          .margin(20)
          .onClick(() => {
            this.pathStack.pop(new resultClass(1)); // 回退到上一个页面,将处理结果传入push的onPop回调中。
          })
      }.width('100%').height('100%')
    }.title('pageTwo')
    .onReady((context: NavDestinationContext) => {
      this.pathStack = context.pathStack
    })
  }
}

更多关于HarmonyOS 鸿蒙Next如何实现类似Android的startActivityForResult效果的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,实现类似Android的startActivityForResult效果,可以通过使用Ability(鸿蒙中的应用组件)间的数据传递机制来完成。

鸿蒙系统提供了Intent类用于在不同Ability间传递数据。要实现类似startActivityForResult的功能,可以使用startAbilityForResult方法启动目标Ability,并在目标Ability完成后通过setResult方法返回数据。

具体步骤如下:

  1. 启动目标Ability: 在源Ability中,使用startAbilityForResult方法启动目标Ability,并传入一个请求码。

  2. 处理目标Ability返回的数据: 在源Ability中重写onAbilityResult方法,该方法会在目标Ability通过setResult方法返回数据时被调用。

  3. 在目标Ability中返回数据: 在目标Ability中,完成操作后,使用setResult方法携带数据返回。

需要注意的是,鸿蒙系统的Ability生命周期和Android的Activity有所不同,因此在实现时要确保对鸿蒙系统的生命周期管理有充分理解。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部