我正在构建一个android软键盘,我似乎无法修复这个错误-我有一个阿拉伯语和QWERTY键盘,当我在QWERTY键盘上旋转我的设备时(甚至是阿拉伯语shift),就好像我的程序已经"重新启动",它变成了没有shift的阿拉伯语键盘。
onSaveInstanceState(Bundle savedInstanceState)
不工作,因为我的应用程序没有扩展Activity
,而是扩展InputMethodService
。
我在我的android manifest
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;
}
不确定这是否是解决问题的迂回方法,或者这是否是正确的方法,所以如果有人知道更好的方法,请告诉我。