【发布时间】:2016-03-04 02:05:30
【问题描述】:
我一直在为 Android 开发自定义键盘,但在更换键盘时遇到了一些奇怪的行为... 在第一次运行时(无论是从 Android Studio 构建还是通过 Fabric 分发后),当我使用时,键盘不会关闭:
InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
imeManager.switchToNextInputMethod(getToken(), false /* onlyCurrentIme */);
它将在我的键盘后面打开下一个输入法...但是我的键盘将被强制放在另一个键盘的顶部...它甚至会停留在那里,如果您转到主屏幕...但是作为设备重新启动后,键盘更改没有任何问题...我一直在阅读此内容,并且我发现以前版本的 Android 中的键盘存在一些问题,还有问题吗?
下面可以看到相关代码:
public class CustomKeyboard extends InputMethodService implements KeyboardView.OnKeyboardActionListener {
private KeyboardView kv;
private Keyboard keyboard;
public final static int CodeRowFourGlobe = 55041;
@Override
public View onCreateInputView() {
kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
keyboard = new Keyboard(this, R.xml.custom_keyboard);
kv.setPreviewEnabled(false);
kv.setKeyboard(keyboard);
kv.setOnKeyboardActionListener(this);
return kv;
}
private IBinder getToken() {
final Dialog dialog = getWindow();
if (dialog == null) {
return null;
}
final Window window = dialog.getWindow();
if (window == null) {
return null;
}
return window.getAttributes().token;
}
@Override
public void onPress(int primaryCode) {
}
@Override
public void onRelease(int primaryCode) {
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
if (primaryCode == Keyboard.KEYCODE_DELETE) {
ic.deleteSurroundingText(1, 0);
} else if (primaryCode == CodeRowFourGlobe) {
InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
imeManager.switchToNextInputMethod(getToken(), false /* onlyCurrentIme */);
} else {
/* not relevant */
}
}
@Override
public void onText(CharSequence text) {
}
@Override
public void swipeLeft() {
}
@Override
public void swipeRight() {
}
@Override
public void swipeDown() {
}
@Override
public void swipeUp() {
}
}
您知道这是我如何更换键盘的问题还是已知的 Android 问题?
【问题讨论】:
-
您每次都在 onKey() 方法中重新创建
InputMethodManager的实例。最好在onCreate()中创建一个类级实例。