2016-03-07 46 views
3

我有一个包含消息被发布到服务器像哇一句!超级图片#超级#图片#111#222喜欢图片如何改变文字部分的颜色的Android

我想提取hastags并使它们变为彩色,并保持文本的其余部分完好无损。

我试过下面的代码,但没有工作。

private void spannableOperationOnHastag() { 
     mPostMessage = edPostMessage.getText().toString().trim(); 
     String strPreHash = null; 
     String strHashText = ""; 
     if (mPostMessage.contains("#")) { 
      try { 
       int index = mPostMessage.indexOf("#"); 
       strPreHash = mPostMessage.substring(0, index); 
       SpannableString spannableString = new SpannableString(strPreHash); 


       String strHashDummy=mPostMessage.substring(index, mPostMessage.length()); 
       int hashCount= StringUtils.countMatches(strHashDummy, "#"); // check for number of "#" occurrence and run forloop for getting the number of hastags in the string 
       int hasIndex=0; 
       for (int i = 0; i <hashCount ; i++) { 
        strHashText = strHashText+strHashDummy.substring(hasIndex, strHashDummy.indexOf(' '))+" "; 
        hasIndex =strHashText.indexOf(" "); // updating new space(" ") position in the index variable 
       } 


       SpannableString spannableStringBlue = new SpannableString(strHashText); 
       spannableStringBlue.setSpan(new ForegroundColorSpan(PublishPostActivity.this.getResources().getColor(R.color.blue)), 0, strHashText.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
       edPostMessage.setText(null); // clearing old string 
       edPostMessage.append(spannableString); // setting extracted coloured text 
       edPostMessage.append(spannableStringBlue); 
      } catch (Exception e) { 
       Log.d(TAG, "validatePostMessage() called with " + "e = [" + e + "]"); 
      } 
     } 
    } 

回答

2

我解决了这个问题我自己。我的任何一个需要它可以参考这个代码:)

private void spannableOperationOnHastag() throws Exception{ 
     mPostMessage = edPostMessage.getText().toString()+" "; // extra space for spannable operations 
     List<Integer> listStartPos = new ArrayList<>(); 
     List<Integer> listEndtPos = new ArrayList<>(); 

     if (mPostMessage.contains("#")){ 
      for (int i = 0; i < mPostMessage.length(); i++) { 
       if (mPostMessage.charAt(i) == '#') { 
        listStartPos.add(i); 
        Log.d(TAG, "startIndex of # = " + i); 
       } 
      } 
      for (int i = 0; i < listStartPos.size(); i++) { 
       int endIndex = mPostMessage.indexOf(' ', listStartPos.get(i)); 
       listEndtPos.add(endIndex); 
       Log.d(TAG, "endIndex of # " + (endIndex)); 
      } 
      SpannableString spanned = SpannableString.valueOf(mPostMessage); 
      for (int i = 0; i < listStartPos.size(); i++) { 
       spanned = new SpannableString(spanned); 
       spanned.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.blue)), listStartPos.get(i), listEndtPos.get(i), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
       Log.d(TAG, "substring " + mPostMessage.substring(listStartPos.get(i), listEndtPos.get(i) + 1)); 
      } 
      mPostMessage.trim(); // removing extra space. 
      edPostMessage.setText(null); 
      edPostMessage.setText(spanned); 

     } 
    } 
0

改变你的代码如下

SpannableString spannableStringBlue = new SpannableString(strHashText); 

spannableStringBlue.setSpan(new ForegroundColorSpan(new ForegroundColorSpan(Color.BLUE), 0, strHashText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

edPostMessage.setText(null); // clearing old string 
edPostMessage.append(spannableString); // setting extracted coloured text 
edPostMessage.append(spannableStringBlue); 
+0

看代码调用它似乎并不完整。在句子中间可能会有很多废话。我想颜色的所有字符串 –

+0

的不是其他的部分我刚刚更改了颜色部分...的spannable的hastags ....你必须实现逻辑你的自我 –

0
SpannableStringBuilder builder = new SpannableStringBuilder(); 
String yourSentence = "PiC#superb #piC#111 #222 enjoyed the pic"; 
String [] newSent = yourSentence.split(" "); 

    for(int count = 0; count < newSent.length; count++){ 
     if(newSent[count].contains("#")){ 
      SpannableString redSpannable= new SpannableString(newSent[count]); 
      redSpannable.setSpan(new ForegroundColorSpan(Color.RED), 0, newSent[count].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

      Log.v("Test", "color_string" + newSent[count]); 
      builder.append(redSpannable+" "); 
     } else{ 
      builder.append(newSent[count]+" "); 
      Log.v("Test", "normal_string" + newSent[count]); 
      } 
     } 

    holder.PhName.setText(builder, TextView.BufferType.SPANNABLE); 
+0

它将只替换“#”不是'#superb ' –

+0

现在?我编辑了我的答案。或者,您可以在#在一个阵列中后把所有的子字符串和替换它像我一样。 – Journey

+0

不工作... –

1

我看你刚刚发布自己的答案,但我已经几乎打完这个了,我想我会继续前进,反正发布此:)。我刚刚输入它没有IDE,所以它可能不完美。

private static SpannableString convertTextColorsAtChar(char trigger, String inputText) { 

    SpannableString spannedText = new SpannableString(inputText); 

    if (!inputText.contains(trigger)) { 
     return spannedText; 
    } 

    ArrayList<int[]> indexArr = getIndexes(trigger, inputText.toCharArray()); 

    for (int[] indexes : indexArr) { 
     spannedText.setSpan(new ForegroundColorSpan(Color.RED), indexes[0], indexes[1], Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

    returned spannedText; 

} 

private static ArrayList<int[]> getIndexes(char trigger, char[] inputText) { 

    ArrayList<int[]> values = new ArrayList<int[]>(); 

    int firstIndex = -1; 
    int secondIndex; = -1 

    for (int i = 0; i < inputText.length; i++) { 
     if (firstIndex != -1 && inputText[i] == ' ') { 
      secondIndex = i; 
      values.add(new int[] { firstIndex, secondIndex }); 
      firstIndex = secondIndex = -1; 
     } 
     if (trigger == inputText[i]) { 
      firstIndex = i; 
     } 
    } 

    return values; 

} 

你会再与convertTextColorsAtChar('#', editText.getText().toString());