Evidenziare il colore del testo utilizzando Html.fromHtml () in Android?


84

Sto sviluppando un'applicazione in cui ci sarà una schermata di ricerca in cui l'utente può cercare parole chiave specifiche e quella parola chiave dovrebbe essere evidenziata. Ho trovato il metodo Html.fromHtml.

Ma mi piacerebbe sapere se è il modo corretto di farlo oppure no.

Per favore fatemi sapere le vostre opinioni su questo.



Risposte:


198

O molto più semplice che gestire Spannablemanualmente le s, dal momento che non hai detto che vuoi lo sfondo evidenziato, ma solo il testo:

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);

8
Vale la pena notare che Html.fromHtml è più lento di SpannableString, perché implica l'analisi. Ma per un breve testo non importa
Michał K

Sembra esserci un'altra soluzione al link . Vedi la risposta di Legend.
Kenneth Evans

1
Proprio come commento, ho scoperto che non avevo bisogno di passare TextView.BufferType.SPANNABLE e funzionava ancora. Grazie!
James

conosci qualche editor html per arrenging testo lungo per Android. ad esempio, sto provando a usare questo sito ( html.am/html-editors/html-text-editor.cfm ) ma se voglio vedere la fonte restituisce il colore in <span style="color:#ff0000;">modo che Android non cambi il colore.
mehmet

@mehmet Potresti presumibilmente cercare e sostituire per cambiare i tag <span> in tag <font> con un attributo "color".
Christopher Orr

36

Utilizzando il valore del colore dalla risorsa xml:

int labelColor = getResources().getColor(R.color.label_color);
String сolorString = String.format("%X", labelColor).substring(2); // !!strip alpha value!!

Html.fromHtml(String.format("<font color=\"#%s\">text</font>", сolorString), TextView.BufferType.SPANNABLE); 

ben fatto. utile per poter utilizzare i colori dalle risorse delle app.
speedynomads

Voglio sottolineare la seconda riga, dove la sottostringa del colore esadecimale: il valore alfa renderebbe l'impostazione del colore non valida! Non dimenticarlo!
marcolav

12

Ciò può essere ottenuto utilizzando una stringa Spannable. Dovrai importare quanto segue

import android.text.SpannableString; 
import android.text.style.BackgroundColorSpan; 
import android.text.style.StyleSpan;

E poi puoi cambiare lo sfondo del testo usando qualcosa come il seguente:

TextView text = (TextView) findViewById(R.id.text_login);
text.setText("");
text.append("Add all your funky text in here");
Spannable sText = (Spannable) text.getText();
sText.setSpan(new BackgroundColorSpan(Color.RED), 1, 4, 0);

Dove questo metterà in evidenza i caratteri in posizione 1 - 4 con un colore rosso. Spero che sia di aiuto!


5
 String name = modelOrderList.get(position).getName();   //get name from List
    String text = "<font color='#000000'>" + name + "</font>"; //set Black color of name
    /* check API version, according to version call method of Html class  */
    if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N) {
        Log.d(TAG, "onBindViewHolder: if");
        holder.textViewName.setText(context.getString(R.string._5687982) + " ");
        holder.textViewName.append(Html.fromHtml(text));
    } else {
        Log.d(TAG, "onBindViewHolder: else");
        holder.textViewName.setText("123456" + " ");   //set text 
        holder.textViewName.append(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY));   //append text into textView
    }

1
come ottenere il colore del carattere da color.xml?
Noor Hossain,

4

Soluzione alternativa: utilizzare invece un WebView. Html è facile da lavorare.

WebView webview = new WebView(this);

String summary = "<html><body>Sorry, <span style=\"background: red;\">Madonna</span> gave no results</body></html>";

webview.loadData(summary, "text/html", "utf-8");

2

il carattere è deprecato usa invece span Html.fromHtml("<span style=color:red>"+content+"</span>")


1

Per rendere parte del tuo testo sottolineato e colorato

nel tuo strings.xml

<string name="text_with_colored_underline">put the text here and &lt;u>&lt;font color="#your_hexa_color">the underlined colored part here&lt;font>&lt;u></string>

poi nell'attività

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_colored_underline)));

e per i link cliccabili:

<string name="text_with_link"><![CDATA[<p>text before link<a href=\"http://www.google.com\">title of link</a>.<p>]]></string>

e nella tua attività:

yourTextView.setText(Html.fromHtml(getString(R.string.text_with_link)));
yourTextView.setMovementMethod(LinkMovementMethod.getInstance());

0
textview.setText(Html.fromHtml("<font color='rgb'>"+text contain+"</font>"));

Darà il colore esattamente a quello che hai creato nell'editor html, basta impostare il textview e concatelo con il valore textview. Android non supporta il colore dello span, cambialo nel colore del carattere nell'editor e sei pronto per partire.


0

Prima converti la tua stringa in HTML, quindi convertila in spannabile. fare come suggeriscono i seguenti codici.

 Spannable spannable = new SpannableString(Html.fromHtml(labelText));
                    
spannable.setSpan(new ForegroundColorSpan(Color.parseColor(color)), spannable.toString().indexOf("•"), spannable.toString().lastIndexOf("•") + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            

0

Aggiungendo anche la versione Kotlin con:

  • ottenere testo dalle risorse ( strings.xml)
  • ottenere colore dalle risorse ( colors.xml)
  • "recupero HEX" spostato come estensione
fun getMulticolorSpanned(): Spanned {
    // Get text from resources
    val text: String = getString(R.string.your_text_from_resources)

    // Get color from resources and parse it to HEX (RGB) value
    val warningHexColor = getHexFromColors(R.color.your_error_color)

    // Use above string & color in HTML
    val html = "<string>$text<span style=\"color:#$warningHexColor;\">*</span></string>"

    // Parse HTML (base on API version)
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
    } else {
        Html.fromHtml(html)
    }
}

E l'estensione Kotlin (con rimozione di alpha):

fun Context.getHexFromColors(
    colorRes: Int
): String {
    val labelColor: Int = ContextCompat.getColor(this, colorRes)
    return String.format("%X", labelColor).substring(2)
}

Demo

demo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.