2015-04-21 2 views
2

J'essaye d'assembler un long morceau de texte (de plusieurs morceaux de données différents) comme le contenu d'un TextView.Vous ne pouvez pas obtenir Spannable tout à fait raison

Je voudrais chaque ligne d'avoir la structure suivante:

{1} pièce | {piece 2}

J'aimerais que chaque "pièce 1 |" soit de couleur gris clair. J'aimerais que chaque "pièce 2" ait une couleur gris foncé.

J'ai défini ces deux couleurs.

Je souhaite que l'intégralité de l'étiquette soit une police personnalisée que j'ai ajoutée à mon application.

Voici ce que je suis en train jusqu'à présent:

// regularTf is a Typeface created from a font added to this app 
mItemCodesLabel.setTypeface(regularTf); 
SpannableStringBuilder builder = new SpannableStringBuilder(); 
ForegroundColorSpan ltGraySpan = new ForegroundColorSpan(R.color.light_gray); 
ForegroundColorSpan dkGraySpan = new ForegroundColorSpan(R.color.dark_gray); 
int index      = 0; 
for (int i = 0; i < codes.size(); i = i + 1) { 
    ParseObject code   = codes.get(i); 
    String value    = code.getString("value") + " | "; 
    if (i > 0) { 
     builder.append("\n"); 
     index     = index + 1; 
    } 
    builder.append(value); 
    builder.setSpan(ltGraySpan, index, index + value.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    index      = index + value.length(); 
    String loc     = code.getString("location"); 
    builder.append(loc); 
    builder.setSpan(dkGraySpan, index, index + loc.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    index      = index + loc.length(); 
} 
mItemCodesLabel.setText(builder, TextView.BufferType.SPANNABLE); 

La couleur du texte de cette étiquette est définie sur R.color.dark_gray dans mon dossier de mise en page.

Les résultats que je vois sont quelque peu confus. J'ai deux codes pour un article, et le TextView ressemble à ceci:

{code 1 pièce 1} | {code 1 pièce 2} {code 2 pièce 1} | {code 2 pièce 2}

"{code 1 pièce 1} |" est gris foncé. Le reste est gris clair. Sur la base de plusieurs tutoriels que j'ai lus sur ce sujet, je ne vois rien de mal avec mon code, mais j'avoue que tout le sujet "Spannable" me dérange encore un peu. Je viens d'iOS, et Spannable ressemble beaucoup à NSAttributedString, mais il semble que je manque quelque chose.

+1

Nous ne pouvons pas utiliser la même instance de 'Span' pour marquer plusieurs parties du texte. Chaque fois que 'setSpan()' est appelé en passant une instance 'Span', l'intervalle précédent marqué par cette instance est effacé. Je pense, en connaissant ce fait, vous pouvez surmonter le problème. Si vous ne me répondez pas, je posterai la réponse. –

+1

@DurgadassS Oui, cela a résolu mon problème. En fait, j'ai trouvé cette information avant votre message à partir d'une autre réponse ici, ainsi que d'essais et erreurs. D'après ce dont je me souviens, cependant, je n'ai jamais pu trouver cette information dans la documentation elle-même. Souhaitez-vous mettre votre commentaire dans une réponse afin que je puisse l'accepter pour que cette information soit plus facile à trouver dans le futur? – mbm29414

Répondre

3

Nous ne pouvons pas utiliser la même instance de Span pour marquer plusieurs parties du texte. Chaque fois que setSpan() est appelée en passant une instance Span, l'intervalle précédent marqué par cette instance est effacé. Je pense, en connaissant ce fait, que vous pourriez résoudre le problème.