Comme le titre l'indique, je veux savoir s'il est possible d'obtenir deux caractères colorés différents dans un seul élément textview.
Comme le titre l'indique, je veux savoir s'il est possible d'obtenir deux caractères colorés différents dans un seul élément textview.
Réponses:
oui, si vous formatez la propriété String
with html
, font-color
transmettez-la à la méthodeHtml.fromHtml(your text here)
String text = "<font color=#cc0029>First Color</font> <font color=#ffcc00>Second Color</font>";
yourtextview.setText(Html.fromHtml(text));
Html.escapeHtml(str)
.
Html.fromHtml(String)
est désormais obsolète, utilisez plutôt Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY)
. Plus d'informations peuvent être trouvées ici.
Vous pouvez imprimer des lignes avec plusieurs couleurs sans HTML comme:
TextView textView = (TextView) findViewById(R.id.mytextview01);
Spannable word = new SpannableString("Your message");
word.setSpan(new ForegroundColorSpan(Color.BLUE), 0, word.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(word);
Spannable wordTwo = new SpannableString("Your new message");
wordTwo.setSpan(new ForegroundColorSpan(Color.RED), 0, wordTwo.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.append(wordTwo);
Vous pouvez utiliser Spannable
pour appliquer des effets à votre TextView
:
Voici mon exemple pour colorer uniquement la première partie d'un TextView
texte (tout en vous permettant de définir la couleur de manière dynamique plutôt que de la coder en dur dans une chaîne comme dans l'exemple HTML!)
mTextView.setText("Red text is here", BufferType.SPANNABLE);
Spannable span = (Spannable) mTextView.getText();
span.setSpan(new ForegroundColorSpan(0xFFFF0000), 0, "Red".length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
Dans cet exemple, vous pouvez remplacer 0xFFFF0000 par un getResources().getColor(R.color.red)
J'ai fait de cette façon:
Définissez la couleur sur le texte en passant la chaîne et la couleur :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Définissez le texte sur TextView / Button / EditText, etc. en appelant le code ci-dessous:
Affichage:
TextView txtView = (TextView)findViewById(R.id.txtView);
Obtenez une chaîne colorée:
String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");
Définissez le texte sur TextView de deux chaînes avec des couleurs différentes:
txtView.setText(Html.fromHtml(name+" "+surName));
Terminé
Html.fromHtml("...")
par des appels versHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Utilisez SpannableStringBuilder
SpannableStringBuilder builder = new SpannableStringBuilder();
SpannableString str1= new SpannableString("Text1");
str1.setSpan(new ForegroundColorSpan(Color.RED), 0, str1.length(), 0);
builder.append(str1);
SpannableString str2= new SpannableString(appMode.toString());
str2.setSpan(new ForegroundColorSpan(Color.GREEN), 0, str2.length(), 0);
builder.append(str2);
TextView tv = (TextView) view.findViewById(android.R.id.text1);
tv.setText( builder, TextView.BufferType.SPANNABLE);
Hé les gars, j'ai fait ça, essayez-le
TextView textView=(TextView)findViewById(R.id.yourTextView);//init
//here I am appending two string into my textView with two diff colors.
//I have done from fragment so I used here getActivity(),
//If you are trying it from Activity then pass className.this or this;
textView.append(TextViewUtils.getColoredString(getString(R.string.preString),ContextCompat.getColor(getActivity(),R.color.firstColor)));
textView.append(TextViewUtils.getColoredString(getString(R.string.postString),ContextCompat.getColor(getActivity(),R.color.secondColor)));
À l'intérieur de votre classe TextViewUtils, ajoutez cette méthode
/***
*
* @param mString this will setup to your textView
* @param colorId text will fill with this color.
* @return string with color, it will append to textView.
*/
public static Spannable getColoredString(String mString, int colorId) {
Spannable spannable = new SpannableString(mString);
spannable.setSpan(new ForegroundColorSpan(colorId), 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.d(TAG,spannable.toString());
return spannable;
}
Il est préférable d'utiliser la chaîne dans le fichier de chaînes, en tant que telle:
<string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
</string>
Usage:
textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
J'ai écrit un code pour une autre question similaire à celle-ci, mais cette question a été dupliquée, je ne peux donc pas y répondre, je mets simplement mon code ici si quelqu'un cherche la même exigence.
Ce code ne fonctionne pas entièrement, vous devez apporter des modifications mineures pour le faire fonctionner.
Voici le code:
J'ai utilisé l'idée @Graeme d'utiliser du texte spannable.
String colorfulText = "colorfulText";
Spannable span = new SpannableString(colorfulText);
for ( int i = 0, len = colorfulText.length(); i < len; i++ ){
span.setSpan(new ForegroundColorSpan(getRandomColor()), i, i+1,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
((TextView)findViewById(R.id.txtSplashscreenCopywrite)).setText(span);
Méthode de couleur aléatoire:
private int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
Essaye ça:
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
Utilisez la classe SpannableBuilder au lieu du formatage HTML lorsque cela est possible, car il est plus rapide que l'analyse du format HTML. Voir mon propre benchmark "SpannableBuilder vs HTML" sur Github Merci!
Des réponses géniales! J'ai pu utiliser Spannable pour créer du texte de couleur arc-en-ciel (afin que cela puisse être répété pour n'importe quel tableau de couleurs). Voici ma méthode, si cela aide quelqu'un:
private Spannable buildRainbowText(String pack_name) {
int[] colors = new int[]{Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE, Color.RED, 0xFFFF9933, Color.YELLOW, Color.GREEN, Color.BLUE};
Spannable word = new SpannableString(pack_name);
for(int i = 0; i < word.length(); i++) {
word.setSpan(new ForegroundColorSpan(colors[i]), i, i+1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return word;
}
Et puis je viens de setText (buildRainboxText (pack_name)); Notez que tous les mots que je passe ont moins de 15 caractères et que cela ne fait que répéter 5 couleurs 3 fois - vous voudrez ajuster les couleurs / la longueur du tableau en fonction de votre utilisation!
if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(String, flag) // for 24 API and more
} else {
Html.fromHtml(String) // or for older API
}
pour 24 API et plus (drapeau)
public static final int FROM_HTML_MODE_COMPACT = 63;
public static final int FROM_HTML_MODE_LEGACY = 0;
public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;
public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;
public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;
public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;
Depuis l'API 24, vous avez FROM_HTML_OPTION_USE_CSS_COLORS afin que vous puissiez définir les couleurs en CSS au lieu de le répéter tout le temps avec font color="
beaucoup plus clair - lorsque vous avez du html et que vous souhaitez mettre en évidence des balises prédéfinies - il vous suffit d'ajouter un fragment CSS en haut de votre html
25 juin 2020 par @canerkaseler
Je voudrais partager la réponse de Kotlin :
fun setTextColor(tv:TextView, startPosition:Int, endPosition:Int, color:Int){
val spannableStr = SpannableString(tv.text)
val underlineSpan = UnderlineSpan()
spannableStr.setSpan(
underlineSpan,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
val backgroundColorSpan = ForegroundColorSpan(this.resources.getColor(R.color.agreement_color))
spannableStr.setSpan(
backgroundColorSpan,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
val styleSpanItalic = StyleSpan(Typeface.BOLD)
spannableStr.setSpan(
styleSpanItalic,
startPosition,
endPosition,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
tv.text = spannableStr
}
Après, appelez la fonction ci-dessus. Vous pouvez appeler plus d'un:
setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)
Sortie: vous pouvez voir le soulignement et différentes couleurs les uns avec les autres.
@canerkaseler