HarmonyOS 鸿蒙Next 子窗口跳转页面的返回问题

HarmonyOS 鸿蒙Next 子窗口跳转页面的返回问题 一个Page A中弹出一个全屏的子窗口,子窗口中跳转到Page B页面,如何实现屏幕左滑返回可以返回上一个页面Page A,目前默认是退出应用到后台了。

3 回复

Navigation的onBackPressed回调函数返回true,可以拦截左滑右滑手势和返回键。

Router可以用这个onBackPress函数,这个是对有@Entry的组件有效的

你手机的系统版本是多少,按道理来说 API12 及以上,onBackPress默认return false;表示使用默认的路由返回逻辑,不设置返回值按照false处理

参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-custom-component-lifecycle-V13#onbackpress

更多关于HarmonyOS 鸿蒙Next 子窗口跳转页面的返回问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这边根据ni的描述,创建了demo,并没有出现退出应用的情况,我这边贴一下测试的demo:

//EntryAbility.ets
import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/pageA', (err, data) => {
      //全局使用
      AppStorage.setOrCreate('windowStage', windowStage);
    });
  }
}
//pageA.ets
import window from '@ohos.window'
import { common, Context } from '@kit.AbilityKit'
import * as subWin from '../pages/subWindow'; // 导入命名路由页面(子窗口)
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct pageA {
  //全局使用
  @State windowStage: window.WindowStage = AppStorage.get('windowStage') as window.WindowStage
  @State context: Context = getContext(this) as common.UIAbilityContext;

  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text('这是 page A').fontSize(20).margin({ bottom: 10 })
      Button('点击打开子窗口').onClick(() => {
        this.windowStage.createSubWindow('mySubWindow', (err, windowClass) => {
          try {
            windowClass.loadContentByName(subWin.entryName, (err: BusinessError) => {
              const errCode: number = err.code;
              if (errCode) {
                console.error(`Failed to load the content. Cause code: ${err.code}, message: ${err.message}`);
                return;
              }
              console.info('Succeeded in loading the content.');
              windowClass.moveWindowTo(0, 0)
              windowClass.showWindow();
              windowClass.setWindowLayoutFullScreen(false);
            });
          } catch (exception) {
            console.error(`Failed to load the content. Cause code: ${exception.code}, message: ${exception.message}`);
          }
        })
      })
    }
    .backgroundColor(Color.Pink).width('100%').height('100%')
  }
}
//subWindow.ets
import { router } from '@kit.ArkUI';

export const entryName: string = 'subWindow';

@Entry({ routeName: entryName })
@Component
struct subWindow {
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text('这是 子窗口').fontSize(20).margin({ bottom: 10 })
      Button('点击跳转 Page B')
        .onClick(() => {
          router.pushUrl({
            url: 'pages/pageB'
          })
        })
    }.backgroundColor(Color.Yellow).width('100%').height('100%')
  }
}
//pageB.ets
import { window } from '@kit.ArkUI'

@Entry
@Component
struct pageB {
  build() {
    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
      Text('这是 Page B,请左滑').fontSize(20).margin({ bottom: 10 }).fontColor(Color.White)
    }.backgroundColor(Color.Green).width('100%').height('100%')
  }

  onBackPress() { //返回时销毁子窗口
    window.findWindow('mySubWindow').destroyWindow()
  }
}

应该是与子窗口设置的位置有关的,可以通过自定义onBackPress来处理返回事件:

自定义组件的生命周期-自定义组件-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

关于HarmonyOS鸿蒙Next子窗口跳转页面的返回问题,以下是一些直接相关的回答:

  1. 默认返回行为:当用户点击返回按钮时,系统会检查导航栈,如果当前页面是由另一个页面跳转而来的,通常会返回到前一个页面。这是系统的默认行为。
  2. 自定义返回逻辑:如果需要自定义返回逻辑,比如在某些情况下不返回到前一个页面,而是跳转到其他页面或执行其他操作,可以在页面的代码中通过事件监听或覆盖系统默认的返回处理来实现。
  3. 子窗口的特殊处理:对于子窗口,其返回行为可能会受到父窗口或整个应用架构的影响。需要确保子窗口的跳转和返回逻辑与整个应用的导航设计保持一致。

如果在使用鸿蒙系统时遇到具体的子窗口跳转页面的返回问题,建议检查以下几点:

  • 确保导航栈的管理逻辑正确。
  • 检查页面间的跳转代码,确保没有错误。
  • 如果使用了自定义的返回逻辑,确保逻辑实现正确。

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

回到顶部