Come dice il titolo, voglio sapere se è possibile ottenere due diversi caratteri colorati in un singolo elemento di visualizzazione di testo.
Come dice il titolo, voglio sapere se è possibile ottenere due diversi caratteri colorati in un singolo elemento di visualizzazione di testo.
Risposte:
sì, se si formatta la Stringcon la html's font-colorproprietà poi passarlo al metodoHtml.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)è ora deprecato, invece usa Html.fromHtml(String, Html.FROM_HTML_MODE_LEGACY). Ulteriori informazioni possono essere trovate qui.
Puoi stampare linee con più colori senza HTML come:
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);
È possibile utilizzare Spannableper applicare effetti a TextView:
Ecco il mio esempio per colorare solo la prima parte di un TextViewtesto (permettendoti di impostare il colore in modo dinamico piuttosto che codificarlo in una stringa come nell'esempio 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);
In questo esempio è possibile sostituire 0xFFFF0000 con a getResources().getColor(R.color.red)
Ho fatto così:
Imposta colore sul testo per passare String e colore :
private String getColoredSpanned(String text, String color) {
String input = "<font color=" + color + ">" + text + "</font>";
return input;
}
Imposta il testo su TextView / Button / EditText ecc chiamando il codice seguente:
TextView:
TextView txtView = (TextView)findViewById(R.id.txtView);
Ottieni una stringa colorata:
String name = getColoredSpanned("Hiren", "#800000");
String surName = getColoredSpanned("Patel","#000080");
Imposta testo su TextView di due stringhe con colori diversi:
txtView.setText(Html.fromHtml(name+" "+surName));
Fatto
Html.fromHtml("...")con le chiamate aHtml.fromHtml("...", FROM_HTML_MODE_LEGACY)
Usa 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);
Ehi ragazzi, l'ho fatto, provatelo
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)));
Dentro di te la classe TextViewUtils aggiungi questo metodo
/***
*
* @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;
}
È meglio usare la stringa nel file string, in quanto tale:
<string name="some_text">
<![CDATA[
normal color <font color=\'#06a7eb\'>special color</font>]]>
</string>
Uso:
textView.text=HtmlCompat.fromHtml(getString(R.string.some_text), HtmlCompat.FROM_HTML_MODE_LEGACY)
Ho scritto del codice per un'altra domanda che è simile a questa, ma quella domanda è stata duplicata, quindi non posso rispondere lì, quindi inserisco il mio codice qui se qualcuno cerca lo stesso requisito.
Non è un codice completamente funzionante, è necessario apportare alcune modifiche minori per farlo funzionare.
Ecco il codice:
Ho usato l'idea di @Graeme di usare un testo analizzabile.
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);
Metodo di colore casuale:
private int getRandomColor(){
Random rnd = new Random();
return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
}
Prova questo:
mBox = new TextView(context);
mBox.setText(Html.fromHtml("<b>" + title + "</b>" + "<br />" +
"<small>" + description + "</small>" + "<br />" +
"<small>" + DateAdded + "</small>"));
Usa la classe SpannableBuilder invece della formattazione HTML dove possibile perché è più veloce dell'analisi del formato HTML. Vedi il mio benchmark "SpannableBuilder vs HTML" su Github Grazie!
Risposte fantastiche! Sono stato in grado di utilizzare Spannable per creare testo di colore arcobaleno (quindi questo potrebbe essere ripetuto per qualsiasi gamma di colori). Ecco il mio metodo, se aiuta qualcuno:
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;
}
E poi ho appena impostatoText (buildRainboxText (nome_pacchetto)); Nota che tutte le parole che passo sono sotto i 15 caratteri e questo ripete solo 3 colori per 3 volte - ti consigliamo di regolare i colori / lunghezza dell'array per il tuo utilizzo!
if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(String, flag) // for 24 API and more
} else {
Html.fromHtml(String) // or for older API
}
per 24 API e altro (flag)
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;
Dall'API 24 hai FROM_HTML_OPTION_USE_CSS_COLORS in modo da poter definire i colori nei CSS invece di ripeterli sempre con font color="
molto più chiaro - quando hai qualche HTML e vuoi evidenziare alcuni tag predefiniti - devi solo aggiungere frammento CSS in cima al tuo HTML
25 giugno 2020 di @canerkaseler
Vorrei condividere la risposta di 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
}
Dopo, chiama la funzione sopra. Puoi chiamarne più di uno:
setTextColor(textView, 0, 61, R.color.agreement_color)
setTextColor(textView, 65, 75, R.color.colorPrimary)
Output: puoi vedere sottolineati e colori diversi tra loro.
@canerkaseler