如何为 android 中的子类型加载不同的键盘布局?

How to load a different keyboard layout for subtype in android?

我正在使用 android 示例 keyboard。它包括 En (US) 和 En (GB) subtypes。选择 subtypes 中的任何一个时,它只会更改空格键上的标志。

说我想根据选择的 subtype 更改布局,但我无法这样做。

到目前为止,我已经为英语 (GB) 创建了另一个 xml 文件,我将其命名为 qwerty_gb.xml(为了测试,我交换了 ReturnDel键)

然后声明为私有

LatinKeyboard mQwertyKeyboardGB;

并在 Softkeyboard.java

onInitializeInterface 覆盖方法中将其与默认键盘一起初始化

像这样:

mQwertyKeyboardGB = new LatinKeyboard(this, R.xml.qwerty_gb);

我不知道我在这里错过了什么。

通过以下修改编辑 SoftKeyboard.java 文件,以便为每个子类型设置特定的布局。

1- 首先参考您的布局。

mQwertyKeyboard = new LatinKeyboard(this, R.xml.qwerty);
mPersianKeyboard = new LatinKeyboard(this, R.xml.persian);

2- 在 OnCreateInputView 中添加以下内容以应用正确的布局。

InputMethodSubtype subtype = mInputMethodManager.getCurrentInputMethodSubtype();
switch(subtype.getLocale()) {
    case "fa_IR":
        setLatinKeyboard(mPersianKeyboard);
        break;
    case "en_US":
        setLatinKeyboard(mQwertyKeyboard);
        break;
}

如果区域设置为 fa_IR,则上述代码适用 mPersianKeyboard。语言环境 fa_IRmethod.xml.

中设置
<subtype
    android:label="@string/label_subtype_generic"
    android:icon="@drawable/icon_en_us"
    android:imeSubtypeLocale="en_US"
    android:imeSubtypeMode="keyboard" />
<subtype
    android:label="@string/label_subtype_generic"
    android:icon="@drawable/icon_en_gb"
    android:imeSubtypeLocale="fa_IR"
    android:imeSubtypeMode="keyboard" />

3- 最后修改 `onCurrentInputMethodSubtypeChanged 方法如下:

@Override
public void onCurrentInputMethodSubtypeChanged(InputMethodSubtype subtype) {
    mInputView.setSubtypeOnSpaceKey(subtype);
    switch(subtype.getLocale()) {
        case "fa_IR":
            setLatinKeyboard(mSymbolsKeyboard);
            break;
        case "en_US":
            setLatinKeyboard(mQwertyKeyboard);
            break;
    };
}

注意: API 级别 24 中不推荐使用 getLocale() 方法。请改用 getLanguageTag()。最好是检查版本,正确的方法使用正确的版本。