實現多子型別輸入法:如何在 HarmonyOS中載入不同的輸入模式

SameX發表於2024-10-30

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。
主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。
本文為原創內容,任何形式的轉載必須註明出處及原作者。

在當今全球化的時代,支援多語言輸入是輸入法應用的基本功能之一。HarmonyOS 的 IME Kit 為開發者提供了靈活的子型別機制,可以輕鬆實現多語言鍵盤佈局、模式切換等功能,為使用者帶來更加便捷和個性化的輸入體驗。本文將深入探討 IME Kit 的子型別功能,並介紹如何配置和切換子型別,以及如何監聽子型別變化事件,幫助你構建功能豐富的多子型別輸入法應用。

輸入法子型別簡介與應用場景

輸入法子型別允許輸入法應用展現不同的輸入模式或語言,使用者可以根據需要在不同模式和語言之間切換。例如,輸入法的中英文鍵盤、手寫板、語音輸入等都屬於輸入法的子型別。
子型別的應用場景

  • 多語言支援: 開發者可以為不同的語言建立不同的子型別,例如中文鍵盤、英文鍵盤、日文鍵盤等,使用者可以根據需要切換不同的語言鍵盤。
  • 模式切換: 開發者可以為不同的輸入模式建立不同的子型別,例如符號鍵盤、表情符號鍵盤、語音輸入鍵盤等,使用者可以根據需要切換不同的輸入模式。
  • 個性化定製: 開發者可以為不同的使用者群體建立不同的子型別,例如兒童鍵盤、老人鍵盤、遊戲鍵盤等,滿足不同使用者群體的個性化需求。

子型別配置與載入

1. InputMethodSubtype 子型別的定義與配置
每個子型別都需要定義一個 InputMethodSubtype 物件,該物件包含以下屬性:

  • id: 子型別的唯一識別符號。
  • label: 子型別的標籤,用於在輸入法切換列表中顯示。
  • icon: 子型別的圖示,用於在輸入法切換列表中顯示。
  • locale: 子型別支援的語言區域。
  • mode: 子型別的輸入模式,例如 "lower"、"upper"、"symbols" 等。
    2. 在 module.json5 中註冊子型別資訊
    module.json5 配置檔案中新增 metadata 欄位,name 設定為 ohos_extension.input_method,並在 resource 欄位中指定子型別配置檔案的路徑。
    示例程式碼
"module": {
    // ...
    "extensionAbilities": [
        "description": "InputMethodExtDemo",
        "icon": "$media:icon",
        "name": "InputMethodExtAbility",
        "srcEntry": "./ets/InputMethodExtensionAbility/InputMethodService.ts",
        "type": "inputMethod",
        "exported": true,
        "metadata": [
            "name": "ohos.extension.input_method",
            "resource": "$profile:input_method_config"
        ]
    ]
}

3. 子型別配置檔案格式
子型別配置檔案使用 JSON 格式,包含 subtypes 陣列,陣列中的每個元素都是一個 InputMethodSubtype 物件。
示例程式碼

{
    "subtypes": [
        {
            "icon": "$media:icon",
            "id": "InputMethodExtAbility",
            "label": "$string:english",
            "locale": "en-US",
            "mode": "lower"
        },
        {
            "icon": "$media:icon",
            "id": "InputMethodExtAbility1",
            "label": "$string:chinese",
            "locale": "zh-CN",
            "mode": "lower"
        }
    ]
}

子型別切換與事件監聽

1. 使用 switchCurrentInputMethodSubtype 切換子型別
IME Kit 提供了 switchCurrentInputMethodSubtype() 方法用於切換當前輸入法應用的子型別。
示例程式碼

import { InputMethodSubtype, inputMethod } from '@kit.IMEKit';
export class KeyboardController {
    async switchCurrentInputMethodSubtype() {
        let subTypes = await inputMethod.getSetting().listCurrentInputMethodSubtype();  // 獲取當前輸入法的所有子型別
        let currentSubType = inputMethod.getCurrentInputMethodSubtype(); // 獲取當前輸入法當前的子型別
        for(let i=0;i<subTypes.length;i++) {
            if(subTypes[i].id != currentSubType.id) { // 判斷不是當前的子型別時切換,實際開發中可以根據需要填固定子型別
                await inputMethod.switchCurrentInputMethodSubtype(subTypes[i]);
            }
        }
    }
}

2. setSubtype 事件監聽器的實現
開發者可以使用 inputMethodAbility.on('setSubtype', (inputMethodSubtype: InputMethodSubtype) => { ... }) 方法監聽子型別變化事件,並根據子型別資訊動態切換鍵盤佈局。
示例程式碼

import { InputMethodSubtype, inputmethodEngine } from '@kit.IMEKit';
let panel: inputmethodEngine.Panel;
let inputMethodAbility: inputmethodEngine.InputMethodAbility = inputmethodEngine.getInputMethodAbility();
inputMethodAbility.on('setSubtype', (inputMethodSubtype: InputMethodSubtype) => {
    let subType = inputMethodSubtype; // 儲存當前輸入法子型別, 此處也可以改變狀態變數的值,佈局中判斷狀態變數,不同的子型別顯示不同的佈局控制元件
    if (inputMethodSubtype.id == 'InputMethodExtAbility') { // 根據不同的子型別,可以載入不同的軟鍵盤介面
        panel.setUiContent('pages/Index');
    }
    if (inputMethodSubtype.id == 'InputMethodExtAbility1') { // 根據不同的子型別,可以載入不同的軟鍵盤介面
        panel.setUiContent('pages/Index1');
    }
});

總結

IME Kit 的子型別功能為我們開發者提供了強大的多語言支援和輸入模式切換能力,可以幫助開發者構建功能豐富的輸入法應用。本文介紹了子型別的概念、配置、切換和事件監聽等操作,幫助你實現多子型別輸入法應用。
下一步的思考

  • 建立一個支援多種語言的輸入法應用,例如中文、英文、日文等。
  • 新增更多的輸入模式,例如符號鍵盤、表情符號鍵盤、語音輸入等。
  • 最佳化子型別切換邏輯,例如根據使用者習慣自動切換子型別。

相關文章