HarmonyOS ArkWeb软键盘对接指南:让Web输入体验如丝般顺滑

HarmonyOS ArkWeb软键盘对接指南:让Web输入体验如丝般顺滑

一起来构建生态吧~
在 ArkTS 侧把异步逻辑包装成 Promise,Native 侧拿到这个 Promise 对象,然后给它挂 then / catch,在回调里获取异步结果或异常。

本文用一个完整示例,走一遍从 ArkTS 到 Native 的链路。


1. 整体思路

  1. ArkTS 侧:

    • 调用 Native 接口时,把一个 callback 传给 Native。
    • Native 调用这个 callback,ArkTS 在 callback 里 返回一个 Promise 对象
    • Promise 内部用 setTimeout 模拟异步,最终 resolvereject
  2. Native 侧:

    • 通过 napi_call_function 调用 ArkTS 传入的 callback,得到 Promise 对象
    • napi_get_named_property 拿到 Promise 的 then 和 `cat

当你在微信里点开一个网页小程序,输入框会自动弹出键盘,键盘样式会根据输入内容智能切换——ArkWeb让这一切在HarmonyOS应用中成为可能。

在HarmonyOS应用开发中,Web组件与软键盘的交互体验直接影响用户感受。ArkWeb提供了一套完整、精细的软键盘对接方案,从自动弹出、智能避让到完全自定义,让内嵌网页的输入体验与原生应用无异。通过灵活的API和遵循W3C标准,开发者能够轻松实现符合用户直觉的键盘交互。


01 遵循W3C标准:为不同场景匹配合适键盘

ArkWeb完整支持W3C标准中的输入属性,让Web开发者可以使用熟悉的HTML属性来控制软键盘行为,无需额外学习成本。

三种核心属性协同工作:

属性 作用 常用值示例
type 定义输入框类型,影响键盘、验证和UI text(文本)、number(数字)、email(邮箱)、tel(电话)
inputmode 优化移动端键盘类型,提供更精准的按键布局 numeric(纯数字)、decimal(带小数点)、search(搜索键)
enterkeyhint 指定回车键的显示文字和功能 done(完成)、next(下一个)、search(搜索)、send(发送)

前端代码示例:

html

<!-- 一个搜索框,会弹出带“搜索”键的文本键盘 -->
<input type="search" inputmode="search" enterkeyhint="search">

<!-- 一个电话号码输入框,弹出数字键盘,回车键显示“下一步” -->
<input type="tel" inputmode="numeric" enterkeyhint="next">

这种声明式的方式,让网页开发者能够轻松地为不同的输入场景配置最合适的键盘,极大地提升了用户体验。

02 智能避让:软键盘弹出时的布局艺术

软键盘会占据近一半的屏幕空间,如何让页面内容不被遮挡是关键。ArkWeb提供了多层级、可配置的避让策略

第一层:应用全局避让模式(在UIAbility中设置)
在应用窗口创建时,可以设置整个应用的避让逻辑,它决定了ArkWeb组件避让的“基础规则”。

typescript

// EntryAbility.ets
onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent('pages/Index', (err, data) => {
        // 获取窗口的UIContext并设置避让模式
        let uiContext = windowStage.getMainWindowSync().getUIContext();
        // RESIZE模式:窗口高度压缩,所有组件(包括Web)跟随整体重新布局
        // OFFSET模式(默认):窗口高度不变,各组件自行决定如何避让
        uiContext.setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE);
    });
}

第二层:Web组件自身避让模式
当应用全局模式为OFFSET时,Web组件可以通过.keyboardAvoidMode()接口独立控制自己的避让行为,优先级更高。

typescript

// Index.ets
Web({ src: $rawfile("index.html"), controller: this.controller })
    .keyboardAvoidMode(WebKeyboardAvoidMode.OVERLAYS_CONTENT) // 设置Web自身避让模式

ArkWeb提供三种避让模式:

  • RESIZE_CONTENT:同时调整可视视口(你看到的区域)和布局视口(网页实际大小)。效果类似窗口被整体顶起。
  • RESIZE_VISUAL:仅调整可视视口,布局视口不变。页面内容会产生类似“放大镜”的视觉效果。
  • OVERLAYS_CONTENT(示例所用):不调整任何视口,键盘直接覆盖在页面上。需要确保输入框本身能被滚动到可视区域。

特殊场景处理:在嵌套滚动等复杂布局中,文档明确建议不要使用RESIZE_VISUALRESIZE_CONTENT,以免产生不可预料的滚动冲突。此时,OVERLAYS_CONTENT或通过expandSafeArea()扩展安全区是更稳妥的选择。

03 深度控制:拦截与完全自定义键盘

对于有更高要求的场景,ArkWeb允许应用完全接管键盘的拉起过程,这是其能力集的精髓所在。

通过onInterceptKeyboardAttach回调,你可以在键盘弹出前进行拦截,并决定使用何种键盘:

  1. 使用带定制回车键的系统键盘
  2. 使用完全自定义的自绘制键盘

以下是一个综合判断并返回不同键盘选项的示例:

typescript

// Index.ets
import { webview } from '@kit.ArkWeb';
import { inputMethodEngine } from '@kit.IMEKit';

@Entry
@Component
struct WebComponent {
    controller: webview.WebviewController = new webview.WebviewController();
    webKeyboardController: WebKeyboardController = new WebKeyboardController(); // 用于控制自定义键盘

    build() {
        Column() {
            Web({ src: $rawfile('index.html'), controller: this.controller })
                .onInterceptKeyboardAttach((KeyboardCallbackInfo) => {
                    // 1. 初始化选项,默认为系统键盘
                    let option: WebKeyboardOptions = { useSystemKeyboard: true };

                    if (!KeyboardCallbackInfo) return option;

                    // 2. 保存控制器,用于后续向输入框发送文本、删除等指令
                    this.webKeyboardController = KeyboardCallbackInfo.controller;

                    // 3. 获取网页输入框上的自定义属性(前端开发人员设置的数据标志)
                    let attributes = KeyboardCallbackInfo.attributes;

                    // 4. 根据自定义属性决定键盘类型
                    if (attributes) {
                        if (attributes['data-keyboard'] == 'custom') {
                            // 场景A:使用完全自定义键盘
                            console.info('启用完全自定义键盘');
                            option.useSystemKeyboard = false;
                            option.customKeyboard = () => {
                                // 返回一个自定义的ArkUI组件作为键盘
                                this.customKeyboardBuilder()
                            };
                            return option;
                        }
                        if (attributes['enter-key'] != undefined) {
                            // 场景B:使用带特定回车键的系统键盘
                            option.useSystemKeyboard = true;
                            // 将前端属性映射到系统的回车键类型常量
                            option.enterKeyType = this.getEnterKeyType(attributes['enter-key']);
                            return option;
                        }
                    }
                    // 场景C:默认使用系统键盘
                    return option;
                })
        }
    }

    // 构建自定义键盘UI的Builder函数
    @Builder
    customKeyboardBuilder() {
        Column() {
            Row() {
                Button('插入文本').onClick(() => { this.webKeyboardController.insertText('Hello'); })
                Button('删除').onClick(() => { this.webKeyboardController.deleteBackward(1); })
                Button('完成').onClick(() => { this.webKeyboardController.close(); })
            }
        }
        .width('100%')
        .backgroundColor('#f0f0f0')
    }
}

对应的,前端网页可以通过在输入框上设置自定义属性来“请求”特定的键盘类型:

html

<!-- 请求完全自定义键盘 -->
<input type="text" data-keyboard="custom">

<!-- 请求带“搜索”回车键的系统键盘 -->
<input type="text" enter-key="search">

这种机制实现了前端与原生应用的无缝协作:前端通过属性声明意图,应用侧根据意图提供最匹配的输入体验。

04 自动获焦:提升体验的关键细节

除了响应用户点击,我们还可以在页面加载后自动弹出键盘,提升操作效率。这需要ArkTS和前端JavaScript的配合。

typescript

// Index.ets
Web({ src: $rawfile("index.html"), controller: this.controller })
    .onPageEnd(() => { // 在页面加载完成后执行
        // 步骤1: 让前端输入框获得焦点
        this.controller.runJavaScript(`document.getElementById('autoFocusInput').focus()`)
        .then(() => {
            // 步骤2: 短暂延迟后,调用系统API弹出软键盘
            setTimeout(() => {
                import { inputMethod } from '@kit.IMEKit';
                inputMethod.getController().showTextInput();
            }, 10); // 一个小延迟确保焦点切换完成
        });
    })

最佳实践建议

  1. 默认遵循标准:对于大多数输入场景,优先使用W3C的typeinputmodeenterkeyhint属性,这是最通用和可维护的方式。
  2. 慎用复杂避让:在嵌套滚动等复杂布局中,优先选择OVERLAYS_CONTENT模式或安全区方案,避免布局错乱。
  3. 自定义键盘的用途:自定义键盘非常适合游戏内嵌聊天(特定按钮)、特殊符号输入、或需要与应用深度联动的场景。
  4. 体验一致性:如果你的应用本身有独特的自定义键盘,在Web组件中也使用它,可以给用户带来统一连贯的体验。

ArkWeb的软键盘对接方案,从标准的自动适配,到灵活的避让控制,再到深度的自定义能力,形成了一套完整的输入体验解决方案。掌握它,你就能确保用户在任何内嵌网页中,都能获得流畅、自然、符合预期的输入体验。

posted @ 2025-12-22 21:53  帅哥一天八碗米饭  阅读(2)  评论(0)    收藏  举报