鸿蒙开发5.0【原生能力的键盘控制】

应用通常使用键盘的方式,系统键盘的弹出收起,获焦失焦,高度监听,安全避让等。

应用经常会遇到如下的业务诉求:

场景一:进入页面TextInput获焦,弹出系统键盘。

场景二:点击按钮或其他事件触发TextInput获焦,弹出系统键盘。

场景三:键盘弹出后只上抬特定的输入组件。

场景四:监听键盘高度,在键盘弹出后让组件上移,键盘收起后让组件恢复。

场景五:设置窗口在键盘抬起时的页面避让模式为上抬,压缩。

方案描述

场景一:

进入页面TextInput获焦,弹出系统键盘。

效果图

2

方案

通过defaultFocus通用属性设置,实现第一次进入页面后弹出键盘。

核心代码

TextInput({ text: $$this.username, placeholder: "请输入用户名" })

  .placeholderColor("#D4D3D1")

  .backgroundColor(this.isUserNameFocus ? "#80FFFFFF" : "#ffffff")

  .width(260)

  .borderRadius(8)

  .id("username")

  .margin({ top: 10, bottom: 10 })

  .onFocus(() => {

    this.isUserNameFocus = true

  })

  .onBlur(() => {

    this.isUserNameFocus = false

  })

  .defaultFocus(true)   // 进入页面默认获焦

场景二:

点击登录按钮触发密码输入TextInput获焦,弹出系统键盘。

效果图

3

方案

通过focusControl.requestFocus,实现输入账号后,点击登录按钮后,代码主动设置TextInput获取焦点

核心代码

Button("登  录")

  .width(200)

  .height(45)

  .fontSize(28)

  .type(ButtonType.Normal)

  .backgroundColor("#30FFFFFF")

  .border({ width: 1, color: Color.White, radius: 8 })

  .margin({ top: 50, bottom: 60 })

  .onClick(() => {

    let LoginForm: LoginForm = {

      username: this.username,

      password: this.password

    }

    let requestId = ""

    // todo: 无法使用for..in遍历对象

    if (!LoginForm.username) {

      requestId = "username"

    } else if (!LoginForm.password) {

      requestId = "password"

    } else {

      promptAction.showToast({ message: 'Login success' })

      return

    }

    let res = focusControl.requestFocus(requestId) // 使选中的this.selectId的组件获焦

    promptAction.showToast({ message: requestId + '不能为空' })

  })

场景三:

键盘弹出后只上抬特定的输入组件。

效果图

4

方案

通过expandSafeArea通用属性设置,实现只上抬红框圈住的特定组件核心代码

.expandSafeArea([SafeAreaType.KEYBOARD], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])

场景四:

监听键盘高度,在键盘弹出后让组件上移,键盘收起后让组件恢复,这种做法定制化程度更高,可以根据开发者需要自行控制页面避让的高度

效果图

5

方案

先通过expandSafeArea禁止自动键盘弹出上移页面。然后通过window.on(‘avoidAreaChange’)和windowClass.on(‘keyboardHeightChange’),实现监听键盘高度,上抬整个页面view,让输入框(生命周期价值输入框)组件能显示在键盘上方。

核心代码

onPageShow(): void {

  // ...

  window.getLastWindow(getContext(this)).then(currentWindow => {

  let property = currentWindow.getWindowProperties();

  let avoidArea = currentWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM);

  // 初始化显示区域高度

  this.screenHeight = px2vp(property.windowRect.height - avoidArea.topRect.height - avoidArea.bottomRect.height);

  // 监视软键盘的弹出和收起

  currentWindow.on('avoidAreaChange', async data => {

  if (data.type !== window.AvoidAreaType.TYPE_KEYBOARD) {

  return;

}

this.screenHeight = px2vp(property.windowRect.height - avoidArea.topRect.height - data.area.bottomRect.height);

})

})

// ...

}

场景五:

设置窗口在键盘抬起时的页面避让模式为上抬,压缩。

效果图

6

方案

点击生命周期输入框,通过windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode,实现设置窗口在键盘抬起时的页面避让模式,这种情况下当键盘弹起的时候页面会自动压缩。

核心代码

onPageShow(): void {

  // ...

  this.windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)

  // ...

}



onPageHide(): void {

  this.windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.OFFSET)

}

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

在这里插入图片描述

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值