Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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
Java 使用BackgroundColorSpan时光标不可见_Java_Android_Android Edittext - Fatal编程技术网

Java 使用BackgroundColorSpan时光标不可见

Java 使用BackgroundColorSpan时光标不可见,java,android,android-edittext,Java,Android,Android Edittext,我正在使用BackgroundColorSpan突出显示EditText中的某些文本。我遇到的问题是,如果颜色有100%的alpha,文本字段的光标不可见,并且很难用较低的alpha看到 我对EditText和EditText(用于在EditText中绘制文本)的代码进行了一些挖掘,发现在Editor.onDraw(…)中,光标在布局之前绘制(布局反过来绘制文本): 有人知道我怎样才能扭转这种行为吗?目前我唯一能想到的选择是自己画光标或者做一些反射巫毒。两者似乎都有点过分了 更新: 我已经在A

我正在使用
BackgroundColorSpan
突出显示
EditText
中的某些文本。我遇到的问题是,如果颜色有100%的alpha,文本字段的光标不可见,并且很难用较低的alpha看到

我对
EditText
EditText
(用于在
EditText
中绘制文本)的代码进行了一些挖掘,发现在
Editor.onDraw(…)
中,光标在布局之前绘制(布局反过来绘制文本):

有人知道我怎样才能扭转这种行为吗?目前我唯一能想到的选择是自己画光标或者做一些反射巫毒。两者似乎都有点过分了


更新:


我已经在Android问题跟踪器上为此创建了一个bug报告:

我最终的解决方案是创建两个扩展。一个是EditText,另一个是
背景色span

BackgroundColorSpan
的扩展并不改变
updateDrawState()
TextPaint
的背景色,但它允许外部类访问这种颜色

EditText的扩展将查找特殊的
BackgroundColorSpan
,并在调用超级实现之前在
onDraw()中手动绘制背景

此要点显示了完整的解决方案(需要创建导入):


注意:如果跨度被保存和恢复(例如在旋转时),则效果不好,因此在恢复时可能需要操纵跨度。

此功能有什么新功能吗?该链接已被删除。
    if (highlight != null && selectionStart == selectionEnd && mCursorCount > 0) {
>>      drawCursor(canvas, cursorOffsetVertical);
        // Rely on the drawable entirely, do not draw the cursor line.
        // Has to be done after the IMM related code above which relies on the highlight.
        highlight = null;
    }

    if (mTextView.canHaveDisplayList() && canvas.isHardwareAccelerated()) {
        drawHardwareAccelerated(canvas, layout, highlight, highlightPaint,
                cursorOffsetVertical);
    } else {
>>      layout.draw(canvas, highlight, highlightPaint, cursorOffsetVertical);
    }