android - EditText 在清除文本时崩溃
问题描述
我想从 EditText 中清除文本。我试过了:
editText.setText("")
editText.text.clear()
editText.editableText.clear()
它有效。但有时会有例外。
2018-12-11 16:23:44.367 13388-13388/com.example.helios.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.helios.myapplication, PID: 13388
java.lang.IndexOutOfBoundsException: setSpan (0 ... 6) ends beyond length 0
at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1265)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:684)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:677)
at android.widget.Editor$SuggestionsPopupWindow.updateSuggestions(Editor.java:3608)
at android.widget.Editor$SuggestionsPopupWindow.show(Editor.java:3480)
at android.widget.Editor.replace(Editor.java:359)
at android.widget.Editor$3.run(Editor.java:2129)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776
我从一个被覆盖的代码中执行该代码performClick()
(我正在创建一个 EditText 的子类)。
似乎 EditText 没有意识到它应该取消/忘记建议机制并且它失败了。
你知道我应该做些什么特别的事情来取消/防止建议失败吗?
我注意到如果我让弹出窗口出现,然后在 X 处单击两次(第一个关闭弹出窗口,第二个执行清除代码),就会发生异常。
更新:
代码的相关部分。实际代码有一个插件系统来添加不同的绘图和动作,但相关代码是这个:
class MyEditText(..): EditText(context) {
...
override fun onTouchEvent(event: MotionEvent?): Boolean {
event!!
ensureDrawingInfo()
when (event.actionMasked) {
MotionEvent.ACTION_DOWN, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
lastTouchArea = pluginAreaFromMotionEvent(event)
}
}
return super.onTouchEvent(event)
}
override fun performClick(): Boolean {
lastTouchArea?.let {
plugins[it.pluginIndex].onClick(this, it.rightSide, ::invalidateDrawingInfo)
return true
}
return super.performClick()
}
class MyPlugin(val drawableLeft: Drawable, val drawableRight: Drawable) : Plugin {
....
override fun onClick(editText: MyEditText, rightSide: Boolean, redraw: () -> Unit) {
if (rightSide) {
// X
editText.text.clearSpans()
editText.text.clear()
}
}
}
解决方案
setSpan
问题是“updateSuggestions”在您更改文本后尝试EditText
。因此,您需要在编辑器修改后进行文本更改EditText
。只需将您的代码放入view.post
科特林
mEditText.post {
mEditText.setText("your text")
}
爪哇
mEditText.post(new Runnable() {
@Override
void run() {
mEditText.setText("your text");
}
});
推荐阅读
- ios - 从文本字段上的日期选择器设置当前日期
- javascript - 将开始日期设置为倒计时
- angular - Angular 5 http.post formdata 和处理结果
- angular - 无法使用角度 4 中的打字稿过滤嵌套对象元素
- python - 尝试登录基于 aspx 的网站时出现“未找到用户”
- groovy - 指导:将并行增量嵌套循环转换为流
- c# - 是否可以将 asp.net core 2.1 web api 与 sql server 中的现有数据库连接?
- java - getResponseAsStream - InputStream 指向什么?
- sql - 从sql server中的表中获取前n行
- entity-framework - Linq to Entity Group 后跟 Min