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一样)。