Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android InputMethodService生命周期错误_Android_Android Input Method - Fatal编程技术网

Android InputMethodService生命周期错误

Android InputMethodService生命周期错误,android,android-input-method,Android,Android Input Method,我正在写我自己的InputMethodService,我想基本上检测键盘何时弹出和关闭,以便开始和停止操作。我有一个最简单的“MyInput”类,它做的很少: public class MyInput extends InputMethodService { private static final String TAG = "MyInput"; @Override public View onCreateInputView() { Log.d(TAG,

我正在写我自己的
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 **/
我不明白为什么这么简单的例子不起作用。非常感谢您的帮助

不幸的是,这本书真的很缺乏。通过大量调试,我(最初为自己)创建了一个更好的IME生命周期文档:


关于您的初始问题,如果您想知道您的键盘当前是否正在显示,您不应该查看
onStartInput
,但您需要查看
onStartInputView
。您的键盘在
onStartInputView
onFinishInputView

Hmm之间的调用中可见,阅读了InputMethodService的Android API说明,其中提到“当用户在输入目标之间切换时,您将收到对onFinishInput()和onStartInput(EditorInfo,布尔)”的调用。这可以解释你正在经历的行为。同意,我认为这门课的文档确实缺乏/没有说实话。最后,我使用onWindowShown和onWindowHidden来检测键盘何时显示。要理解的关键是,所有按键输入都通过InputMethodService,无论窗口是否可见。当该活动首次显示时,它会创建一个InputConnection,用于处理诸如音量键、后退键、dpad导航(如果设备有dpad)等基本内容。当用户聚焦EditText时,您将获得基本InputConnection的OnFinishInput,然后是EditText的InputConnection的onStartInput。通常可以通过检查EditorInfo.inputType==inputType.TYPE\u NULL来区分这两种情况。