Android 安卓键盘没有';关不上

Android 安卓键盘没有';关不上,android,ime,Android,Ime,我一直在为Android开发一个定制键盘,在更换键盘时我遇到了一些奇怪的行为。。。 在第一次运行时(从Android Studio构建或通过Fabric分发后),当我使用以下命令时,键盘不会关闭: InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); imeManager.switchToNextInputMethod(getToken()

我一直在为Android开发一个定制键盘,在更换键盘时我遇到了一些奇怪的行为。。。 在第一次运行时(从Android Studio构建或通过Fabric分发后),当我使用以下命令时,键盘不会关闭:

InputMethodManager imeManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
imeManager.switchToNextInputMethod(getToken(), false /* onlyCurrentIme */);
它将打开键盘后面的下一个输入法。。。但我的键盘会被压在另一个键盘上。。。它甚至会留在那里,如果你去主屏幕。。。但一旦设备重新启动,键盘就不会发生任何问题。。。我一直在读这篇文章,我发现以前版本的安卓系统中的键盘有一些问题,还有问题吗

您可以在下面看到相关代码:

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() {

    }
}

你知道这是我如何更换键盘的问题还是安卓系统的已知问题吗?

试试这个,我随时都可以用

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();
}


}

ime的可见性由系统本身处理

几天前,我遇到了一个类似的问题,并通过从头开始编写IME来修复它&在后台线程上执行所有耗时的工作(如getTextBeforeCursor()/getTextAfterCursor、本地数据库读/写等)

如果您多次从/切换到另一个IME,并且同样的事情发生,那么这就是我要讨论的问题

因此,您可能正在调用一些需要时间或使IME卡住的东西。只需参考您正在拨打的电话的文档,检查它们是否需要不确定的时间


希望这有帮助。

您将如何使用它?我不能用“this”来调用它,因为我的类不能强制转换为活动此方法..并调用此方法hideKeyboard(youractivity.this)或使用GetApplicationContext..无论何时尝试隐藏键盘都不要在此类中使用..在活动或片段中使用..直接我没有任何片段。。。该应用程序只有实现键盘的主活动和服务类,因此我只能从我的服务类以外的其他地方调用它。每次在onKey()方法中,您都在重新创建
InputMethodManager
的实例。最好在
onCreate()中创建一个类级实例。