HarmonyOS 鸿蒙Next 侧滑系统返回监听

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

HarmonyOS 鸿蒙Next 侧滑系统返回监听 从屏幕边框左右滑动距离比较小的时候,会自动返回前一级,这个如何监听。现在整体使用的是 全局唯一个Navigation,在https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-273-V5 可以监听到Navigation侧滑,但是在NavDestination中无法监听

2 回复

通常返回监听方案,在各NavDestination中监听:
https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs-V5/faqs-arkui-273-V5

希望在navigation上监听

  1. 可以传递方法到子页面中,每个NavDestination的onBackPressed里调用
  2. 监听路由信息,自己根据路由变化做判断,参考
@Watch('backPressChild') 
@Provide('pageInfos') 
pageInfos: NavPathStack = new NavPathStack()
  1. 使用customNavContentTransition监听返回
    参考:
    https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-basic-components-navigation-V5#customnavcontenttransition11
// Index.ets
import { SegmentButton } from '@kit.ArkUI'
import { ItemRestriction, SegmentButtonOptions, SegmentButtonTextItem } from '@ohos.arkui.advanced.SegmentButton'
import { PageOneTmp } from './navigationOne'
import { pageTwoTmp } from './navigationTwo'
import { Pages } from './navigationTwo'

@Entry
@Component
struct NavigationExample {
  @Watch('backPressChildWatch') @Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack()

  @State tabSelectedIndexes: number[] = [1]

  backPressChildWatch(){
    console.info("监听到路由变化:",JSON.stringify(this.pageInfos))
  }

  backPressChild(){
    console.info("传入子页面返回回调:",JSON.stringify(this.pageInfos))
  }

  @State tabOptions: SegmentButtonOptions = SegmentButtonOptions.tab({
    buttons: [{ text: '最热' }, { text: '最新' }] as ItemRestriction<SegmentButtonTextItem>,
    backgroundColor: '#f8f6f6',
    selectedBackgroundColor: '#f8f6f6',
    backgroundBlurStyle: BlurStyle.NONE
  })

  @Builder
  PageMap(name: string,params:string) {
    if (name === 'web') {
      PageOneTmp({backF:this.backPressChild})
    } else if (name === 'pageTwo') {
      pageTwoTmp({ names: name, values: this.pageInfos } as Pages)
    }
  }

  build() {
    Navigation(this.pageInfos) {
      Column () {
        SegmentButton({
          options: this.tabOptions,
          selectedIndexes: $tabSelectedIndexes
        }).width(80).height(25)
        Button('pushPath', { stateEffect: true, type: ButtonType.Capsule })
          .width('80%')
          .height(40)
          .margin(20)
          .onClick(() => {
            this.pageInfos.pushPathByName('web','baidu') //将name指定的NavDestination页面信息入栈
          })
      }
    }
    .customNavContentTransition((from: NavContentInfo, to: NavContentInfo, operation: NavigationOperation) =>{
      if(operation === 2)
        console.info("customNavContentTransition监听到返回")
      return undefined
    })
    .onNavBarStateChange((isVisible:Boolean)=>{
      console.info("当前状态改变:isVisible",isVisible)
    })
    .title('NavIndex').navDestination(this.PageMap)
  }
}

import { SegmentButton } from '@kit.ArkUI'
import { ItemRestriction, SegmentButtonOptions, SegmentButtonTextItem } from '@ohos.arkui.advanced.SegmentButton'

// PageOne.ets
@Component
export struct PageOneTmp {
  @Consume('pageInfos') pageInfos: NavPathStack;

  @State isShowModal:boolean = false
  @State isShowPanel:boolean = false
  @State tabSelectedIndexes: number[] = [1]
  backF:() => void = () => {}
  @State tabOptions: SegmentButtonOptions = SegmentButtonOptions.tab({
    buttons: [{ text: '最热' }, { text: '最新' }] as ItemRestriction<SegmentButtonTextItem>,
    backgroundColor: '#f8f6f6',
    selectedBackgroundColor: '#f8f6f6',
    backgroundBlurStyle: BlurStyle.NONE
  })

  build() {
    NavDestination() {
      Column () {
        Row(){
          SegmentButton({
            options: this.tabOptions,
            selectedIndexes: $tabSelectedIndexes
          }).width(80).height(25)
        }
        Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
          .width('80%')
          .height(40)
          .margin(20)
          .onClick(() => {
            this.pageInfos.pushPathByName('pageTwo',null )
          })
      }.width('100%').height('100%')
    }.title('pageOne')
    .onBackPressed(() => {
      this.backF()
      const popDestinationInfo = this.pageInfos.pop() // 弹出路由栈栈顶元素
      return false
    })
  }
}

// PageTwo.ets
export class Pages {
  names: string = ""
  values: NavPathStack | null = null
}

@Builder
export function pageTwoTmp(info: Pages) {
  NavDestination() {
    Column () {
      Button('pushPathByName', { stateEffect: true, type: ButtonType.Capsule })
        .width('80%')
        .height(40)
        .margin(20)
        .onClick(() => {
          (info.values as NavPathStack).pushPathByName('pageOne', null)
        })
    }.width('100%').height('100%')
  }.title('pageTwo')
  .onReady((ctx: NavDestinationContext) => {
    console.info("触发pageTwo的")
  })
  .onBackPressed(() => {
    (info.values as NavPathStack).pop()
    return true
  })
}
  1. 代码里只是把三种监听方式放一起了,第1种方法传到子页面的会用到onBackPressed,不过这个是多个子页面共用1个监听回调
  2. 做拦截的话还是需要到onBackPressed里面做

更多关于HarmonyOS 鸿蒙Next 侧滑系统返回监听的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,对于侧滑系统返回的监听,通常涉及到对系统导航栏交互事件的捕捉和处理。鸿蒙系统提供了一套事件监听机制,允许开发者在不直接操作底层代码(如C语言或Java代码)的情况下,通过其特有的API或框架来实现这一功能。

具体实现方式可能依赖于你所使用的开发框架和组件。在鸿蒙的ArkUI(使用TypeScript或eTS语言)中,你可以通过监听页面的滑动事件来实现侧滑返回的监听。例如,使用PageSlider组件时,可以监听其滑动状态变化来判断用户是否进行了侧滑操作。

此外,鸿蒙系统可能也提供了特定的系统事件或回调接口来捕捉导航栏的返回操作。开发者需要查阅鸿蒙的官方开发文档,找到与侧滑返回相关的系统事件或API,并按照文档说明进行实现。

通常,这些事件或API会允许你定义回调函数,当侧滑返回动作发生时,系统会调用这些回调函数,从而允许你的应用响应这一操作。

请注意,由于鸿蒙系统的不断更新和迭代,具体的实现方式可能会有所变化。建议直接参考最新的鸿蒙官方开发文档或示例代码来获取最准确的信息。

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

回到顶部