3

J'ai une phrase qui contient un message à être publié sur le serveur comme wow! superbe photo #superb #piC# 111 # 222 apprécié la photocomment changer la couleur du texte partiellement en android

Je veux extraire le hastags et les rendre colorés et laissant le reste du texte intact.

J'ai essayé le code suivant mais ne fonctionnait pas.

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 + "]"); 
      } 
     } 
    } 

Répondre

2

J'ai résolu le problème moi-même. Je l'une a besoin peut se rapporter ce code :)

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

changer votre code comme ci-dessous

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

regardant le code ne semble pas être complète. Il peut y avoir plusieurs hastags au milieu de la phrase. Je voulais colorier toutes les hastags pas d'autres parties de la chaîne –

+0

je viens de changer votre partie de couleur ... le spannable .... vous devez implémenter votre logique –

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

il va remplacer seulement le '#' pas '#superb ' –

+0

Maintenant? J'ai édité ma réponse. Ou, vous pouvez prendre toutes les sous-chaînes après le # dans un tableau et le remplacer comme je l'ai fait. – Journey

+0

ne fonctionne pas ... –

1

Je vois que vous venez de votre propre réponse au courant, mais comme je l'avais presque fini de taper ce haut je pensais aller de l'avant et après cela de toute façon :) Je l'ai tapé juste maintenant sans IDE, donc ce n'est peut-être pas parfait.

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; 

} 

Vous auriez alors appelez avec convertTextColorsAtChar('#', editText.getText().toString());