如何使用多个文本制作spannable?

时间:2014-03-08 10:25:42

标签: android spannablestring

String sentence="this is @part 1 and #here another and #another one @user  #newone @itsme ";

    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setText(addClickablePart(sentence), BufferType.SPANNABLE);


    private SpannableStringBuilder addClickablePart(String str) {
    SpannableStringBuilder ssb=new SpannableStringBuilder(str);

    int idx1=Math.min(str.indexOf("@"),str.indexOf("#") );

    int idx2=0;
    while (idx1!=-1) {
        idx2=str.indexOf(" ", idx1) + 1;

        final String clickString=str.substring(idx1, idx2);
        ssb.setSpan(new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                Toast.makeText(getApplicationContext(), clickString,
                        Toast.LENGTH_SHORT).show();
            }
        }, idx1, idx2, 0);

        idx1=Math.min(str.indexOf("#", idx2),str.indexOf("@", idx2) );

    }

    return ssb;
}

前五个单词的工作正常,但留下了最后一个单词(@itsme)。 它只留下最后一个(无论字符串的长度是多少)。

1 个答案:

答案 0 :(得分:2)

在while语句中放入一个条件来检查字符串大小。

我认为最后一个循环中的idx2为0,因为str.indexOf()为-1,然后-1 +1 = 0。

因此,如果idx2为0,请检查是否可点击,直到最后一个

使用以下代码:

while (idx1 != -1) {

            idx2 = sentence.indexOf(" ", idx1) + 1;

            if(idx2 == 0)  
                 idx2 = sentence.length(); // or str.lenght()-1 

            idx2 = sentence.indexOf(" ", idx1) + 1;

            final String clickString=str.substring(idx1, idx2);
            ssb.setSpan(new ClickableSpan() {

                @Override
                public void onClick(View widget) {
                     Toast.makeText(getApplicationContext(), clickString,
                          Toast.LENGTH_SHORT).show();
              }
         }, idx1, idx2, 0);

            idx1 = FindMin(idx2+1 , sentence);
        }

FindMin是:

public int FindMin(int i2 , String mystr)
    {
        int idx1 = mystr.indexOf("@" , i2);
        int idx2 = mystr.indexOf("#" , i2);


        int minIndex;
        if(idx1 >= 0 && idx2 >= 0 )
         minIndex  =  Math.min(mystr.indexOf("@" , i2) ,mystr.indexOf("#" , i2) );

        else if (idx1 >= 0)
          minIndex = idx1;

        else
           minIndex = idx2;

        return minIndex;
    }