Java 突出显示文本视图中的文本行,包括所有宽度

Java 突出显示文本视图中的文本行,包括所有宽度,java,android,textview,Java,Android,Textview,我已经介绍了一些如何使用Spannable类突出显示TextView中某些文本的解决方案。但它只允许突出显示由字符组成的代码段。如果我想突出显示一个包含TextView宽度的文本行,但这一行中的文本不能填充整个视图的宽度,该怎么办 如果有人在这种情况下有经验,我很乐意接受建议 更新: 好的,我希望下面的图片能让我的目标更加清晰 这是我使用Spannable可以实现的: 这就是我想要的: 我真的希望这很清楚。您可以在xml布局文件中执行android:padding=“5dp”,您可以通过样式

我已经介绍了一些如何使用
Spannable
类突出显示
TextView
中某些文本的解决方案。但它只允许突出显示由字符组成的代码段。如果我想突出显示一个包含
TextView
宽度的文本行,但这一行中的文本不能填充整个视图的宽度,该怎么办

如果有人在这种情况下有经验,我很乐意接受建议

更新: 好的,我希望下面的图片能让我的目标更加清晰

这是我使用
Spannable
可以实现的:

这就是我想要的:


我真的希望这很清楚。

您可以在xml布局文件中执行android:padding=“5dp”,您可以通过样式xml和可扩展字符串突出显示Noramly,希望它能正常工作

TextView TV = (TextView)findViewById(R.id.text);
TV.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE);

Spannable WordtoSpan = (Spannable) TV.getText();

WordtoSpan.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

TV.setText(WordtoSpan);


这可能会帮助您将下面的代码保存到可绘图文件夹中

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="<<your color code"/>
</shape>

并指定textview背景,如下所示

android:background="@drawable/<<your file name>>"
android:background=“@drawable/”

使用
StateListDrawable
可以更轻松地完成您要做的事情

使所有的
文本视图在触摸模式下可聚焦。为textview的背景色和文本颜色定义statelistdrawables,并在需要突出显示textview时调用
requestFocus()

textview背景的StateListDrawable:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
     android:state_focused="true"
     android:drawable="#0F0" />

    <item android:drawable="#0000" />

</selector>


类似地,为文本颜色定义一个选择器列表。

可能有一种更简单的方法,但我相信您需要实现一个实现LineBackgroundSpan的类来实现所需的功能。下面是一些示例代码:

public class MyActivity extends Activity {

    private static class MySpan implements LineBackgroundSpan {
        private final int color;

        public MySpan(int color) {
            this.color = color;
        }

        @Override
        public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline,
                int bottom, CharSequence text, int start, int end, int lnum) {
            final int paintColor = p.getColor();
            p.setColor(color);
            c.drawRect(new Rect(left, top, right, bottom), p);
            p.setColor(paintColor);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TextView tv = new TextView(this);
        setContentView(tv);

        tv.setText("Lines:\n", BufferType.EDITABLE);
        appendLine(tv.getEditableText(), "123456 123 12345678\n", Color.BLACK);
        appendLine(tv.getEditableText(), "123456 123 12345678\n", Color.RED);
        appendLine(tv.getEditableText(), "123456 123 12345678\n", Color.BLACK);
    }

    private void appendLine(Editable text, String string, int color) {
        final int start = text.length();
        text.append(string);
        final int end = text.length();
        text.setSpan(new MySpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
}

您能详细解释一下如何在xml中指定突出显示吗?这对我没有帮助,因为这是使用
Spannable
类的标准示例。正如我在问题中提到的:它只突出显示一个由字符组成的内容,我想突出显示整行,包括整
TextView
的宽度有一个简单的
TextView
,它以宽度填充它的父视图。为什么不将ListView与多个TextView一起使用?@MichałK我想了一下,但是在一个使用
ListView
的案例中,我的触摸模式出现了问题。当我尝试调用
setSelection()
时,即使调用
setFocusableInTouchMode(true),也没有效果
。你有没有想过用statelistdrawable而不是
Spanable
?每一行都是不同的文本视图,或者只是一个大的文本视图?这样我可以为整个
textview
定义背景,我想动态突出显示
textview
行中的一行,这取决于从网络提交的数据连接。这是一个有趣的解决方案,但在这种情况下,我必须使用每行一个
TextView
在我的应用程序中使用一个由多个行组成的
TextView
的颜色,但是您能解释一下为什么要在
trackground()
方法处设置两次颜色?我理解为什么在方法执行的开始设置颜色,但为什么我需要在结束时设置颜色?我允许自己更正代码,因为这是更好的做法,在构造函数中为矩形分配内存,而不是在绘图阶段,在绘图阶段,您可以重设它的属性。准备好给你赏金了吗?如果你愿意回答我在前面的评论中提出的问题,那么你甚至可以使用在Activity/TextView级别上分配的一个(因为我相信它只是按顺序使用的)。关于设置颜色的两个调用,我发现传入的Paint对象是框架用于绘制TextView其余部分的对象,因此如果我在使用它后忽略将其设置回原始颜色,则下一行文本将以我们的背景色绘制。您可能也可以在这里使用外部绘制对象(就像上面的Rect一样)。