Android:使用Spannable将带有项目符号的文本放入TextView

时间:2015-11-03 17:46:48

标签: android textview spannablestring

我需要用几种语言写一些文字。 文字如下:

标题

  • 一个
  • 两个
  • 3

Anouther Title

  • 一个
  • 两个
  • 3

项目符号与其他文本的颜色不同。

我在Spannable中听到了Android,但不幸的是,我只能将span用于fromend个int值。问题在于,在不同的语言中,我的单词会有不同的位置,因此可用的文本不适合我。你能帮我解决一下吗?

2 个答案:

答案 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元素(项目符号列表)。那么,您将拥有两个(或更多)选项: