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;
}
不确定这是否是解决问题的迂回方法,或者这是否是正确的方法,所以如果有人知道更好的方法 - 请告诉我。
我正在构建一个 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;
}
不确定这是否是解决问题的迂回方法,或者这是否是正确的方法,所以如果有人知道更好的方法 - 请告诉我。