【问题标题】:Android keyboard doesn't closeAndroid 键盘无法关闭
【发布时间】: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() 中创建一个类级实例。

标签: android ime


【解决方案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();
}


}

【讨论】:

  • 你会如何使用它?我不能用 'this' 来调用它,因为我的课程不能被转换为活动
  • 这是方法..并调用此方法 hideKeyboard(youractivity.this) 或使用 getApplicatioContext..无论您试图隐藏键盘的任何地方
  • 不要在这个类中使用..在活动或片段中使用..直接
  • 我没有任何片段...该应用程序只有主要活动和实现键盘的服务类,所以我只能从我的服务中调用它类
【解决方案2】:

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

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

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2020-02-24
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多