2013-11-25 97 views
4

我有一個字符串,我想要顏色的特定字。這些詞是以#開始的那個詞。Android通過字符串循環來顏色特定字

if(title.contains("#")){ 

     SpannableString WordtoSpan = new SpannableString(title); 

     int idx = title.indexOf("#"); 
     if (idx >= 0) { 

      Pattern pattern = Pattern.compile("[ ,\\.\\n]"); 
      Matcher matcher = pattern.matcher(title); 
      int wordEnd = matcher.find(idx)? matcher.start() : -1; 

      if (wordEnd < 0) { 
       wordEnd = title.length(); 
      } 
      WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 
         idx, 
         wordEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     }   

     holder.txtTitle.setText(WordtoSpan); 
    } else { 
     holder.txtTitle.setText(title); 
    } 

現在讓我們如此字符串 粗體部分是例如彩色字。

我愛奶酪#burgers,並與#ketchup。

^這是我目前用我的代碼。我想要的是爲每個#單詞着色,而不僅僅是第一個單詞。

ex。它就會像

我愛奶酪#burgers,並與#ketchup

我想我需要循環?但無法得到它明確和工作x.x中


更新: 最新嘗試。列表變爲空白。

SpannableString WordtoSpan = new SpannableString(title); 

    int end = 0; 

    Pattern pattern = Pattern.compile("[ ,\\.\\n]"); 
    Matcher matcher = pattern.matcher(title); 

    int i = title.indexOf("#"); 

    for (i = 0; i < title.length(); i++) { 
    if (i >= 0) { 

     int wordEnd = matcher.find(i)? matcher.start() : -1; 

     if (wordEnd < 0) { 
      wordEnd = title.length(); 
     } 
     WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 
        i, 
        wordEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

     i = end; 
    }  

    holder.txtTitle.setText(WordtoSpan); 
    } 

回答

4

我很驚訝,沒有人提到了這一點:

// String you want to perform on 
String toChange = "I love cheese #burgers, and with #ketchup."; 

// Matches all characters, numbers, underscores and dashes followed by '#' 
// Does not match '#' followed by space or any other non word characters 
toChange = toChange.replaceAll("(#[A-Za-z0-9_-]+)", 
         "<font color='#0000ff'>" + "$0" + "</font>"); 

// Encloses the matched characters with html font tags 

// Html#fromHtml(String) returns a Spanned object 
holder.txtTitle.setText(Html.fromHtml(toChange)); 

#0000ff == >>Color.BLUE

截圖:

enter image description here

+0

沒有任何變化,顏色與其他文字保持一致。 –

+0

@JohnJared添加了上面的截圖。問題可能在代碼中的其他位置? – Vikram

+0

嗯,找出原因。在我的應用程序Cuz我有阿拉伯文字母#這就是我爲什麼,但是當我改變阿拉伯文到他們工作。我怎樣才能讓它變成阿拉伯語的顏色呢? –

1

你需要遍歷你的匹配。有一前一後,你可以在這裏看看:

Finding Multiple Integers Inside A String Using Regex

+0

找到它們很好(我可以使用.split(「#」),但如何找到它們**和**在同一時間在字符串中對它們進行着色? –

+0

if(title.contains(「#」)){ Matcher matcher = pattern.matcher(title); 而(matcher.find()){// 做ForegroundcolorSpan等 } } –

0

使用while()this is the snippet設置文字的背景色中搜索Android原生的使者,你可以在你的代碼嘗試相同。

+0

檢查我更新的問題,我使用的同時嘗試。現在沒有出現在列表中。 –

1

檢查下面的例子:

String title = "Your #complete sentence #testing #test."; 
printUsingNormal(title); 
printUsingRegex(title); 

private static void printUsingRegex(String title) { 
    Pattern pattern = Pattern.compile("[ ,\\.\\n]"); 

    int start = 0; 
    int end = 0; 
    Matcher matcher = pattern.matcher(title); 
    while (end >= 0 && end < title.length()) { 
     start = title.indexOf('#', start); 
     if (start > 0) { 
      end = matcher.find(start) ? matcher.start() : -1; 
      if (end > 0) { 
       System.out.println("Word : " + title.substring(start, end) 
         + " Start : " + start + " End : " + end); 
       start = end; 
      } 
     } else { 
      break; 
     } 
    } 
} 

private static void printUsingNormal(String title) { 
    int start = 0; 
    for (int i = 0; i < title.length(); i++) { 
     char c = title.charAt(i); 
     if (c == '#') { 
      start = i; // Got the starting hash 
      int end = title.indexOf(' ', i + 1); // Finding the next space. 
      if (end > 0) { 
       System.out.println("Word : " + title.substring(start, end) 
         + " Start : " + start + " End : " + end); 
       i = end; 
      } else { 
       end=title.length()-1; 
       System.out.println("Word : " + title.substring(start, end) 
         + " Start : " + start + " End : " + end); 
       i = end; 
      } 
     } 
    } 
} 
+0

請在上面找到我更新的答案。它使用正則表達式和直接的方式。 –

+0

嗯,現在我很困惑。我現在如何使用它?你可以用舊的答案做正則表達式嗎?(所以正則表達式+循環詮釋我) –

+0

請檢查我的最新嘗試在我的答案的更新。看看我的意思,以及我錯過了什麼。 –

4

我提供了這個答案早在這裏 - https://stackoverflow.com/a/20179879/3025732

String text = "I love chicken #burger , cuz they are #delicious"; 
//get the text from TextView 

Pattern HASHTAG_PATTERN = Pattern.compile("#(\\w+|\\W+)"); 
Matcher mat = HASHTAG_PATTERN.matcher(text); 

while (mat.find()) { 
    String tag = mat.group(0); 

    //String tag will contain the hashtag 
    //do operations with the hashtag (change color) 
} 

[編輯]

我是根據你的需要修改的代碼,做:

SpannableString hashText = new SpannableString(text.getText().toString()); 
Matcher matcher = Pattern.compile("#([A-Za-z0-9_-]+)").matcher(hashText); 
while (matcher.find()) 
{ 
    hashText.setSpan(new ForegroundColorSpan(Color.BLUE), matcher.start(), matcher.end(), 0); 
} 
text.setText(hashText); 

這裏有一個屏幕截圖:

enter image description here

+0

但我不知道如何「做手術」,我是一個初學者,試圖與我的兄弟發展。所以如何提供結束,開始等.. –

+0

@JohnJared請檢查我更新的答案與你想要的代碼示例 – JoelFernandes

+0

令人驚歎!謝謝。 –