鸿蒙开发:一文了解软键盘相关

程序员一鸣
• 阅读 1

前言

代码运行环境:全部基于HarmonyOs NEXT

DevEco Studio:Build Version: 5.0.3.900

API:12

modelVersion:5.0.0

前段时间,简单写了备忘录小应用,有一个小功能,那就是,底部的一排样式编辑按钮,在键盘未弹出时,就在页面底部展示,当键盘弹起时,就悬浮在软键盘之上,方便在内容编辑时进行样式修改,就如下图红框中的编辑按钮。

鸿蒙开发:一文了解软键盘相关

实现上面的效果,其实也很简单,无非就是监听软键盘的高度,根据软键盘的高度来动态设置底部组件的高度即可。

@State keyboardHeight: number = 0; // 软键盘高度

  aboutToAppear(): void {
    window.getLastWindow(getContext(this)).then(currentWindow => {
      currentWindow.on('keyboardHeightChange', (data: number) => {
        this.keyboardHeight = px2vp(data);
      })
    })
  }

上面的处理方式,有一点需要注意,如果当前页面非沉浸式,那么需要减去非安全区的高度,也就是状态栏和导航栏的高度。

本文的内容,着重概述一下,开发中和软键盘相关的知识点,基本内容如下:

1、手动弹出和隐藏软件盘

2、主动获取焦点弹出软件盘

3、焦点移动至下一个组件

4、软件盘的避让机制

5、相关总结

一、手动弹出和隐藏软件盘

弹出

需要给可输入组件设置id,设置后,就可以使用下面的代码进行手动调起软键盘。

this.getUIContext().getFocusController().requestFocus('id')

隐藏

直接清除焦点即可。

this.getUIContext().getFocusController().clearFocus()

除此之外,也可以使用stopInputSession方法。

inputMethod.getController().stopInputSession()

二、主动获取焦点弹出软件盘

如果你想要一进入某一个页面,或者弹出弹窗时进行自动的弹出软件盘,可以给可输入组件,设置属性defaultFocus为true即可。

defaultFocus(true)

三、焦点移动至下一个组件

很多场景下,比如验证码,支付密码等等,都会有多个输入组件,并且可以自动移动至下一个,其实就是改变组件焦点的id。

this.getUIContext().getFocusController().requestFocus('id')

四、软件盘的避让机制

避让,是为了不让输入框被软键盘遮挡,其实系统默认就提供了输入框避让软键盘的能力,如果你的输入框在软键盘弹出后有被遮挡的可能,那么点击输入框,就可以发现,整体的页面会被上抬,否则不会。

鸿蒙开发:一文了解软键盘相关

可以看到,上边的例子,点击1到9都不会上抬,但是10以下,就会主动的上抬,这就是系统的默认避让。

鸿蒙开发:一文了解软键盘相关

软键盘避让模式有两种,一种是上抬,一种是页面保持不对,系统默认的就是上抬模式,如果你不想让页面上抬,可以针对模式进行改变。

上抬模式(KeyboardAvoidMode.OFFSET,为了避让软键盘,Page内容会整体上抬,系统默认即是,也可以通过代码进行实现。

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

压缩模式(KeyboardAvoidMode.RESIZE),会压缩Page的大小,其设置百分比的组件会跟随Page一起压缩,除此之外,安全避让,expandSafeArea([SafeAreaType.KEYBOARD],[SafeAreaEdge.BOTTOM])也会不生效。

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

一般压缩模式会结合动态设置组件的高度,比如前言中的效果,动态监听软键盘的高度进行设置。

鸿蒙开发:一文了解软键盘相关

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;
        }
        if (data.area.bottomRect.height <= 0) {
          this.isKeyBoardHidden = true;
        } else {
          this.isKeyBoardHidden = false;
        }
        this.screenHeight = px2vp(property.windowRect.height - avoidArea.topRect.height - data.area.bottomRect.height);
      })
    })

五、相关总结

软键盘最主要的就是合理的进行避让,不能遮挡可输入组件,再有多个输入框的时候,需要动态的进行设置高度,这一点需要注意。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
京东云开发者 京东云开发者
9个月前
鸿蒙跨端实践-ArkTS和CAPI的混合开发实现
一、背景在文章中,讲述了动态化适配鸿蒙的方案实现,当在鸿蒙系统进行UI渲染的时候,我们使用了系统的组件进行递归渲染。在iOS和Android也是借助各自系统组件进行的渲染,但是在鸿蒙系统会存在以下4个严重问题:1.UI层级过多以金融APP理财频道页中的一个
少湖说 少湖说
7个月前
鸿蒙Flutter实战:02-Windows环境搭建踩坑指南
鸿蒙Flutter实战:02Windows环境搭建踩坑指南环境搭建1.下载FlutterSDK,配置环境变量鸿蒙FlutterSDK需要在。目前建议下载dev分支代码。需要配置以下用户变量注意鸿蒙开发需要安装Java和配置相关变量bashfluttersd
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
飞龙AI 飞龙AI
1个月前
DevEcoStudio 中使用模拟器时如何过滤日志
DevEcoStudio中使用模拟器时如何过滤日志鸿蒙核心技术鸿蒙开发者工具DevEcoStudio在HilogSettingsFilter设置Logmessage:A03d00/JSAPP当你看到不断更新的日志时,你会不会崩溃因为Nofilters模式下
程序员一鸣 程序员一鸣
2星期前
鸿蒙开发:了解@Builder装饰器
@Builder装饰是鸿蒙UI开发中,非常重要的一个装饰器,在实际的开发中,合理且正确的使用,能够让我们的代码更加的简洁,有两点需要注意,一是,是用私有还是全局,取决于当前的组件的复用机制,如果多个页面都使用了,建议以全局为主;二是传参的动态更新,有更新就使用引用参数传递,没有更新按值传递即可。
程序员一鸣 程序员一鸣
5小时前
鸿蒙开发:自定义一个动态输入框
在鸿蒙开发中,如何实现这一效果呢,最重要的解决两个问题,第一个问题是,如何在上一个输入框输入完之后,焦点切换至下一个输入框中,第二个问题是,如何禁止已经输入的输入框的焦点,两个问题解决完之后,其他的就很是简单了。
程序员一鸣 程序员一鸣
5小时前
鸿蒙开发:如何解决软键盘弹出后的间距
三种方式,比较推荐方式一,简单便捷,一行代码便可以搞定,当然,另外两种也是实现的办法,在实际的开发中,选择适合的即可。