Android键盘无法关闭

时间:2015-11-30 12:21:21

标签: android ime

我一直在为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问题的?

2 个答案:

答案 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卡住的东西。只需参考您正在进行的呼叫的文档,检查它们是否需要不确定的时间。





希望这会有所帮助。