Estoy buscando cambiar el texto de una vista TextView a través del método .setText ("") mientras también 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?
Respuestas:
Utilice tramos .
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);
fuente
title.setText(Html.fromHtml("Your big island <b>ADVENTURE!</b>"));
fuente
<font color="#FFAADD>text</font>
no funcionará?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 su código Java, puede 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 manera, solo la parte "Prueba" se coloreará (y se resaltará).
fuente
Aquí hay un ejemplo que buscará todas las apariciones de una palabra (no distingue entre mayúsculas y minúsculas) y las coloreará de 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);
fuente
Puede usar a
Spannable
para dar ciertos aspectos a ciertas partes de un texto. Puedo buscar un ejemplo si lo desea.Ah, desde aquí en stackoverflow .
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);
fuente
Si está usando Kotlin, puede hacer lo siguiente usando la biblioteca android-ktx
val title = SpannableStringBuilder() .append("Your big island ") .bold { append("ADVENTURE") } titleTextField.text = title
El
bold
es una función de extensión enSpannableStringBuilder
. Puede ver la documentación aquí para obtener una lista de las operaciones que puede utilizar.Otro ejemplo:
val ssb = SpannableStringBuilder() .color(green) { append("Green text ") } .append("Normal text ") .scale(0.5F) { append("Text at half size ") } .backgroundColor(green) { append("Background green") }
Donde
green
hay un color RGB resuelto.Incluso es posible anidar intervalos para que termine con algo como un DSL integrado:
Necesitará lo siguiente en el nivel de módulo de su aplicación
build.gradle
para que funcione:repositories { google() } dependencies { implementation 'androidx.core:core-ktx:0.3' }
fuente
val spannableStringBuilder = SpannableStringBuilder() spannableStringBuilder.bold { underline { color(R.color.test_color) { append(underlinedText) } } }
Si desea utilizar HTML, debe utilizar
TextView.setText(Html.fromHtml(String htmlString))
Si desea hacer eso a menudo / repetidamente, puede echar un vistazo a una clase ( SpannableBuilder ) que escribí, ya
Html.fromHtml()
que no es muy eficiente (está usando una gran maquinaria de análisis xml en su interior). Se describe en esta publicación de blog .fuente
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) { continue; } 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);
fuente
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:
fuente
Me gusta usar
SpannableStringBuilder
agregando los diferentes intervalos uno por uno, en lugar de llamar a setSpan calculando las longitudes de las cadenascomo: (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) }
fuente
Puede concatenar dos o más intervalos. De esta manera es más fácil colorear el texto dinámico usando 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);
fuente
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!"));
fuente
Html.fromHtml
está en desusoUtilice HtmlCompat en su lugar
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY)
fuente