我一直在为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问题的?
答案 0 :(得分:1)
试试这个随时都适合我
public static void hideKeyboard( Context context ) {
try {
InputMethodManager inputManager = ( InputMethodManager ) context.getSystemService( Context.INPUT_METHOD_SERVICE );
View view = ( (Activity) context ).getCurrentFocus();
if ( view != null ) {
inputManager.hideSoftInputFromWindow( view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
} catch ( Exception e ) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
ime的可见性由系统本身处理。


几天前我遇到了类似的问题,并通过再次编写IME从头开始修复它。在后台线程上做所有耗时的事情(比如getTextBeforeCursor()/ getTextAfterCursor,本地数据库读/写等)。


如果从/切换到另一个IME不止一次,同样的事情发生,那就是我正在谈论的问题。


所以也许你正在调用需要时间或让IME卡住的东西。只需参考您正在进行的呼叫的文档,检查它们是否需要不确定的时间。


希望这会有所帮助。