首页 > 解决方案 > EditText 在清除文本时崩溃

问题描述

我想从 EditText 中清除文本。我试过了:

它有效。但有时会有例外。

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()
            }
        }
    }

标签: androidandroid-edittext

解决方案


setSpan问题是“updateSuggestions”在您更改文本后尝试EditText。因此,您需要在编辑器修改后进行文本更改EditText。只需将您的代码放入view.post

科特林

mEditText.post {
   mEditText.setText("your text")
}

爪哇

mEditText.post(new Runnable() {
        @Override
        void run() {
            mEditText.setText("your text");
        }
    });

推荐阅读