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

时间:2012-05-18 05:25:00

标签: java android textview

我已经查看过如何使用TextView类突出Spannable中某些文字的一些解决方案。但它只允许突出显示由字符组成的片段。如果我想突出显示包含TextView宽度的文本行,但此行中的文本不会填满整个视图的宽度,该怎么办?

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

更新

好的,我希望以下图片可以明确我的目标。

这是我可以使用Spannable

实现的

enter image description here

这就是我想要的:

enter image description here

我真的希望这很清楚。

4 个答案:

答案 0 :(得分:8)

可能有一种更简单的方法可以执行此操作,但我相信您需要实现一个实现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);
    }
}

答案 1 :(得分:1)

使用StateListDrawable可以更轻松地完成您要做的工作。

让所有TextView都可以在触控模式下进行对焦。为textview的背景颜色和文本颜色定义statelistdrawable,并在想要突出显示文本视图时调用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>

类似地定义文本颜色的选择器列表。

答案 2 :(得分:0)

您可以在xml布局文件中执行android:padding="5dp",并且可以通过样式xml和Spannablestring正常突出显示希望它将起作用欢迎

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);

Link1

这可能对您有所帮助

答案 3 :(得分:0)

将以下代码保存在可绘制文件夹

<?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>>"