texto studio plain mostrar example español edittext android textview

studio - Android: colorear parte de una cadena usando TextView.setText()?



textview html (12)

Estoy buscando cambiar el texto de una vista TextView mediante el método .setText ("") mientras coloreo una parte del texto (o lo hago en negrita, cursiva, transparente, etc.) y no el resto. Por ejemplo:

title.setText("Your big island <b>ADVENTURE!</b>";

Sé que el código anterior es incorrecto pero ayuda a ilustrar lo que me gustaría lograr. ¿Cómo haría esto?


Aquí hay un ejemplo que buscará todas las apariciones de una palabra (sin distinción entre mayúsculas y minúsculas) y las coloreará en rojo:

String notes = "aaa AAA xAaax abc aaA xxx"; SpannableStringBuilder sb = new SpannableStringBuilder(notes); Pattern p = Pattern.compile("aaa", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(notes); while (m.find()){ //String word = m.group(); //String word1 = notes.substring(m.start(), m.end()); sb.setSpan(new ForegroundColorSpan(Color.rgb(255, 0, 0)), m.start(), m.end(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); } editText.setText(sb);


Espero que esto te ayude (funciona con varios idiomas).

<string name="test_string" ><![CDATA[<font color="%1$s"><b>Test/b></font>]]> String</string>

Y en tu código java, puedes hacer:

int color = context.getResources().getColor(android.R.color.holo_blue_light); String string = context.getString(R.string.test_string, color); textView.setText(Html.fromHtml(string));

De esta forma, solo la parte de "Prueba" estará coloreada (y negrita).


Me gusta usar SpannableStringBuilder agregando los diferentes tramos uno por uno, en lugar de llamar a setSpan calculando las longitudes de las cadenas

como: (código Kotlin)

val amountSpannableString = SpannableString("₹$amount").apply { // text color setSpan(ForegroundColorSpan("#FD0025".parseColor()), 0, length, 0) // text size setSpan(AbsoluteSizeSpan(AMOUNT_SIZE_IN_SP.spToPx(context)), 0, length, 0) // font medium setSpan(TypefaceSpan(context.getString(R.string.font_roboto_medium)), 0, length, 0) } val spannable: Spannable = SpannableStringBuilder().apply { // append the different spans one by one // rather than calling setSpan by calculating the string lengths append(TEXT_BEFORE_AMOUNT) append(amountSpannableString) append(TEXT_AFTER_AMOUNT) }


Puede concatenar dos o más Spans. De esta forma es más fácil colorear texto dinámico utilizando el valor de longitud.

SpannableStringBuilder span1 = new SpannableStringBuilder("Android"); ForegroundColorSpan color1=new ForegroundColorSpan(getResources().getColor(R.color.colorPrimary)); span1.setSpan(color1, 0, span1.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); SpannableStringBuilder span2 = new SpannableStringBuilder("Love"); ForegroundColorSpan color2=new ForegroundColorSpan(getResources().getColor(R.color.colorSecondary)); span2.setSpan(color2, 0, span2.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); Spanned concatenated=(Spanned) TextUtils.concat(span1," => ",span2); SpannableStringBuilder result = new SpannableStringBuilder(concatenated); TextView tv = (TextView) rootView.findViewById(R.id.my_texview); tv.setText(result, TextView.BufferType.SPANNABLE);


Puede usar un Spannable para dar ciertas partes de un texto ciertos aspectos. Puedo buscar un ejemplo si quieres.

Ah, desde aquí mismo en .

TextView TV = (TextView)findViewById(R.id.mytextview01); Spannable WordtoSpan = new SpannableString("I know just how to whisper, And I know just how to cry,I know just where to find the answers"); WordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); TV.setText(WordtoSpan);


Si desea usar HTML, necesita usar TextView.setText(Html.fromHtml(String htmlString))

Si desea hacer eso a menudo / repetidamente, puede echar un vistazo a una clase ( SpannableBuilder ) que escribí, ya que Html.fromHtml() no es muy eficiente (está usando una gran maquinaria de análisis xml dentro). Se describe en esta publicación del blog .


Si está usando Kotlin, puede hacer lo siguiente usando la biblioteca android-ktx

val title = SpannableStringBuilder() .append("Your big island ") .bold { append("ADVENTURE") } title.text = s

El bold es una función de extensión en SpannableStringBuilder . Puede ver la documentación here para obtener una lista de operaciones que puede usar.

Otro ejemplo:

val ssb = SpannableStringBuilder() .color(green, { append("Green text ") }) .append("Normal text ") .scale(0.5, { append("Text at half size " }) .backgroundColor(green, { append("Background green") })

Donde el green es un color RGB resuelto.

Incluso es posible anidar tramos para que termines con algo así como un DSL incorporado:

bold { underline { italic { append("Bold and underlined") } } }

Necesitará lo siguiente en su build.gradle nivel de módulo de aplicación para que funcione:

repositories { google() } dependencies { implementation ''androidx.core:core-ktx:0.3'' }


Usa spans

Ejemplo:

final SpannableStringBuilder sb = new SpannableStringBuilder("your text here"); // Span to set text color to some RGB value final ForegroundColorSpan fcs = new ForegroundColorSpan(Color.rgb(158, 158, 158)); // Span to make text bold final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Set the text color for first 4 characters sb.setSpan(fcs, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); // make them also bold sb.setSpan(bss, 0, 4, Spannable.SPAN_INCLUSIVE_INCLUSIVE); yourTextView.setText(sb);


Usa este código es útil

TextView txtTest = (TextView) findViewById(R.id.txtTest); txtTest.setText(Html.fromHtml("This is <font color="#ff4343">Red</font> Color!"));


String str1 = "If I forget my promise to "; String penalty = "Eat breakfast every morning,"; String str2 = " then I "; String promise = "lose my favorite toy"; String strb = "<u><b><font color=''#081137''>"+ penalty +",</font></b></u>"; String strc = "<u><b><font color=''#081137''>"+ promise + "</font></b></u>"; String strd = str1 +strb+ str2 + strc; tv_notification.setText(Html.fromHtml(strd));

o usa este código:

SpannableStringBuilder builder = new SpannableStringBuilder(); SpannableString text1 = new SpannableString(str1); text1.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)), 0, str1.length() - 1, 0); builder.append(text1); SpannableString text2 = new SpannableString(penalty); text2.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, penalty.length(), 0); text2.setSpan(new UnderlineSpan(), 0, penalty.length(), 0); builder.append(text2); SpannableString text3 = new SpannableString(str2); text3.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.silver)),0, str2.length(), 0); builder.append(text3); SpannableString text4 = new SpannableString(promise); text4.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.midnight)), 0, promise.length(), 0); text4.setSpan(new UnderlineSpan(),0, promise.length(), 0); builder.append(text4); tv_notification.setText(builder);


public static void setColorForPath(Spannable spannable, String[] paths, int color) { for (int i = 0; i < paths.length; i++) { int indexOfPath = spannable.toString().indexOf(paths[i]); if (indexOfPath == -1) { return; } spannable.setSpan(new ForegroundColorSpan(color), indexOfPath, indexOfPath + paths[i].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } }

Utilizando

Spannable spannable = new SpannableString("Your big island ADVENTURE"); Utils.setColorForPath(spannable, new String[] { "big", "ADVENTURE" }, Color.BLUE); textView.setText(spannable);


title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>"));