3

我正在编写自己的代码InputMethodService,并且我想基本上检测键盘何时上下弹出以开始和停止做事。我有最简单的“MyInput”类,它做的很少:

public class MyInput extends InputMethodService {
    private static final String TAG = "MyInput";

    @Override
    public View onCreateInputView() {
        Log.d(TAG, "onCreateInputView");
        LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return inflater.inflate(R.layout.my_keyboard, null);
    }

    @Override
    public void onStartInput(EditorInfo attribute, boolean restarting) {
        super.onStartInput(EditorInfo attribute, boolean restarting);
        Log.d(TAG, "onStartInput restarting = " + restarting);
    }

    @Override
    public void onFinishInput() {
        super.onFinishInput();
        Log.d(TAG, "onFinishInput");
    }
}

我的视图正常上下弹出,但在日志中,我可以看到一个非常奇怪的行为。每次键盘显示或隐藏时,都会调用这两个函数;让我无法检测到它何时实际显示。

/** Keyboard not showing, I press an TextView **/
D  onFinishInput
D  onStartInput restarting = false
/** Keyboard showing, I press back **/
D  onFinishInput
D  onStartInput restarting = false
/** Keyboard not showing **/

我不明白为什么这样一个简单的例子不起作用。谢谢你的帮助

4

1 回答 1

2

不幸的是,IME Lifecycle的官方文档确实缺乏。通过大量调试,我(最初为我自己)创建了一个更好的 IME 生命周期文档:

输入法生命周期

关于您最初的问题,如果您想知道您的键盘当前是否正在显示,您不应该查看onStartInput,但您需要查看onStartInputViewonStartInputView您的键盘在和之间的调用中可见onFinishInputView

于 2021-02-17T09:11:05.080 回答