求助:InputConnection.finishComposingText()方法触发NullPointerException问题
解决InputConnection.finishComposingText()的NullPointerException问题
这种NPE我之前在做自定义输入法交互的View时碰过好几次,核心原因一眼就能看出来:你调用finishComposingText()的那个InputConnection实例是null!
从你贴的日志也能直接佐证这一点:
java.lang.NullPointerException: Attempt to invoke interface method 'boolean android.view.inputmethod.InputConnection.finishComposingText()' on a null object reference
为什么会出现这种情况?
- 你的View还没获取到输入焦点,或者输入法还没和View建立连接,这时候调用
getInputConnection()得到的就是null。 - 当View失去焦点、输入法被切换/关闭,或者Activity退到后台时,之前有效的
InputConnection也会变成无效的null引用。
怎么解决?
这里给你几个实用的处理方案:
- 强制判空再调用:这是最直接也最稳妥的做法,每次使用
InputConnection前都做null检查:InputConnection inputConnection = getInputConnection(); if (inputConnection != null) { inputConnection.finishComposingText(); } - 在正确的时机调用:不要在View还没attach到窗口(比如
onCreate阶段)或者失去焦点的时候调用输入法相关方法。可以在View的onFocusChanged回调里,当hasFocus为true时再处理输入法交互逻辑。 - 确保自定义View返回有效的InputConnection:如果是你自己写的自定义View,重写
onCreateInputConnection时一定要返回正确的实例,比如:@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { // 配置输入类型等属性 outAttrs.inputType = InputType.TYPE_CLASS_TEXT; // 返回有效的InputConnection实例 return new BaseInputConnection(this, false); }
额外提醒
就算你之前拿到过有效的InputConnection,也不能保证它一直有效——比如用户切换输入法、按home键回到桌面,这个连接都可能被系统断开。所以每次调用前判空是必须要做的防护动作。
内容的提问来源于stack exchange,提问作者Mayank Bansal
相关产品推荐
相关产品推荐

