我需要用几种语言写一些文字。 文字如下:
标题
Anouther Title
项目符号与其他文本的颜色不同。
我在Spannable
中听到了Android
,但不幸的是,我只能将span
用于from
和end
个int值。问题在于,在不同的语言中,我的单词会有不同的位置,因此可用的文本不适合我。你能帮我解决一下吗?
答案 0 :(得分:2)
我厌倦了处理项目符号文本,我写了一个TextView
子类我称之为BulletTextView
。
我在资源文件中有文本,就像你一样。我将所有文本格式化为使用Unicode项目符号\ u2022来标记项目符号。所以示例文本可能如下所示:
<string name="product_description_text">Our product is absolutely amazing, because
it has these features:
\n\n\u2022 First awesome feature
\n\u2022 Second awesome feature
\n\u2022 Third awesome feature
\n\n(Note that users with a free trial license can\'t access these features.)\n</string>
BulletTextView
会覆盖TextView.setText()
以扫描文本中的项目符号字符,删除它们并保存位置以标记项目符号的跨度:
@Override
public void setText(CharSequence text, BufferType type) {
StringBuilder sb = new StringBuilder();
List<Integer> markers = new ArrayList<Integer>();
for (int i = 0; i < text.length(); i++) {
char ch = text.charAt(i);
switch (ch) {
case '\u2022':
// we found a bullet, mark the start of bullet span but don't append the bullet char
markers.add(sb.length());
// ... I do some other stuff here to skip whitespace etc.
break;
case '\n':
// we found a newline char, mark the end of the bullet span
sb.append(ch);
markers.add(sb.length());
// ... I do some stuff here to weed out the newlines without matching bullets
break;
// ... I have some special treatment for some other characters,
// for instance, a tab \t means a newline within the span
default:
// any other character just add it to the string
sb.append(ch);
break;
}
}
// ... at the end of the loop I have some code to check for an unclosed span
// create the spannable to put in the TextView
SpannableString spannableString = new SpannableString(sb.toString());
// go through the markers two at a time and set the spans
for (int i = 0; i < markers.size(); i += 2) {
int start = markers.get(i);
int end = markers.get(i+1);
spannableString.setSpan(new BulletSpan(gapWidth), start, end, Spannable.SPAN_PARAGRAPH);
}
super.setText(spannableString, BufferType.SPANNABLE);
}
我遗漏了一些特定于我的应用程序的代码,但这是解决问题的基本框架。
不确定是否让你的子弹颜色不同,但有一个BulletSpan
构造函数public BulletSpan(int gapWidth, int color)
可以解决问题。
我试图找出如何使用LineHeight制作更大的线来分隔子弹段,但我无法使其工作。我只是使用换行符来分隔两个子弹部分。
答案 1 :(得分:1)
原生Android [{1}}不支持HTML TextView
/ ul
元素(项目符号列表)。那么,您将拥有两个(或更多)选项:
li
一起使用。使用第三方库。例如,html-textview符合您的要求。