升级至Android Studio 3.1后EditText获焦点时触发StackOverflowError
嘿,这个坑我升级AS3.1的时候实打实踩过!EditText一获取焦点就直接崩,日志里全是InputConnectionWrapper.getTextBeforeCursor无限循环调用的栈信息,给你几个亲测有效的解决思路:
1. 检查自定义InputConnectionWrapper的实现
如果你自己写了InputConnectionWrapper的子类,大概率是重写方法时犯了循环调用的错误——比如在getTextBeforeCursor里不小心调用了this.getTextBeforeCursor,而不是父类的super.getTextBeforeCursor,直接导致无限套娃撑爆栈。
错误示例(别这么写!):
@Override public CharSequence getTextBeforeCursor(int n, int flags) { // 这里调用自身方法,直接触发循环 return this.getTextBeforeCursor(n, flags); }
正确写法:
@Override public CharSequence getTextBeforeCursor(int n, int flags) { // 老老实实调用父类实现,避免循环 return super.getTextBeforeCursor(n, flags); }
另外也别忘了排查第三方库——有些文本格式化、输入法相关的库可能也存在这个问题,看看有没有更新版本修复了该bug。
2. 关掉Instant Run功能
这是AS3.1的已知bug,和Instant Run的代码热替换逻辑有关。操作步骤很简单:
- Windows/Linux:打开
File → Settings;Mac:Android Studio → Preferences - 找到
Build, Execution, Deployment → Instant Run - 取消勾选「Enable Instant Run to hot swap code/resource changes on deploy」
然后重新编译运行,大概率能解决问题。
3. 降级Gradle插件版本
AS3.1对应的gradle插件3.1.x确实存在不少输入相关的小bug,临时降级到更稳定的3.0.1版本也能绕过这个问题:
打开项目根目录的Project级build.gradle,修改buildscript里的依赖:
buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // 其他依赖保持不变 } }
同步项目后重新构建即可。
4. 检查自定义EditText的InputConnection创建逻辑
如果你的项目里有自定义EditText,重写了onCreateInputConnection方法,要确保只对原始InputConnection做一次包装,不要多层嵌套Wrapper,否则也容易触发循环调用。比如:
@Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { // 先获取系统原始的InputConnection InputConnection originalIC = super.onCreateInputConnection(outAttrs); // 只包装一次返回,避免多层嵌套 return new MyCustomInputConnection(originalIC, true); }
额外提醒:这个问题在Android Studio 3.2及后续版本已经被官方修复了,如果项目允许的话,直接升级到更高版本的AS和Gradle插件是一劳永逸的办法。
内容的提问来源于stack exchange,提问作者Kamer358

