Android 软键盘在方向更改时恢复为默认键盘

Android soft keyboard reverts to default keyboard on orientation change

我正在构建一个 android 软键盘,我似乎无法修复此错误 - 我有一个阿拉伯语和 QWERTY 键盘,当我在 QWERTY 键盘上旋转我的设备时(甚至阿拉伯语转换), 就好像我的程序有 "restarted" 并且它变成了没有 shift 的阿拉伯语键盘。

onSaveInstanceState(Bundle savedInstanceState) 不起作用,因为我的应用程序不扩展 Activity,而是扩展 InputMethodService

我将以下内容放入我的 android 清单

android:configChanges="keyboard|keyboardHidden|orientation"
android:windowSoftInputMode="stateUnchanged|adjustResize">

我尝试使用

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        Log.i(MYDEBUG, "Config Changed " + currentKeyboard.equals(qwerty));

    }

然而,currentKeyboard.equals(qwerty)) 总是结果为假,我确保它在方向改变之前是真的。

如有任何帮助,我们将不胜感激。

我认为是应用程序的问题。如果应用程序在方向更改时重新启动,那么您的输入连接将被拆除并重建为新的编辑文本。这意味着键盘会将其视为新连接,并将以默认状态启动。要对此进行测试,请编写一个测试应用程序以关闭配置更改时的重新启动,并查看该应用程序中的键盘是否仍然会发生这种情况。

好吧,经过令人难以置信的思考后,我意识到问题出在代码行 super.onConfigurationChanged(newConfig);

删除后,我的代码会改变方向,但我的键盘不会调整大小。因为我喜欢父级的调整大小功能,所以我制作了一个包含所有键盘的数组,并且在更改方向后,我将更新数组以使键盘数组具有正确的大小。

@Override
public void onConfigurationChanged(Configuration newConfig) {

    int currentKeyboard = 0;
    boolean isShifted = kv.isShifted();
    for (int i = 0; i < keyboard.length; i++) {
        if(kv.getKeyboard().equals(keyboard[i])){
            currentKeyboard = i;
            break;
        }
    }

    super.onConfigurationChanged(newConfig);

    initializeKeyboardArray();
    setKeyboard(keyboard[currentKeyboard]);
    kv.setShifted(isShifted);

}

private void initializeKeyboardArray(){
    keyboard = new Keyboard[7];
    keyboard[ARABIC] = arabic;
    keyboard[ARABIC_SHIFT] = arabicShift;
    keyboard[ARABIC_SYMBOLS] = arabicSymbols;
    keyboard[ARABIC_SYMBOLS_SHIFT] = arabicSymbolsShift;
    keyboard[QWERTY] = qwerty;
    keyboard[QWERTY_SYMBOLS] = qwertySymbols;
    keyboard[QWERTY_SYMBOLS_SHIFT] = qwertySymbolsShift;
}

不确定这是否是解决问题的迂回方法,或者这是否是正确的方法,所以如果有人知道更好的方法 - 请告诉我。