Establecer el color del lapso de TextView en Android

¿Es posible establecer el color de un lapso de texto en un TextView?

Me gustaría hacer algo similar a la aplicación de Twitter, en la que una parte del texto es azul. Ver imagen a continuación:

texto alternativo

Otra respuesta sería muy similar, pero no necesitaría establecer el texto de TextView dos veces

 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); 

Aquí hay una pequeña función de ayuda. ¡Ideal para cuando tienes múltiples idiomas!

 private void setColor(TextView view, String fulltext, String subtext, int color) { view.setText(fulltext, TextView.BufferType.SPANNABLE); Spannable str = (Spannable) view.getText(); int i = fulltext.indexOf(subtext); str.setSpan(new ForegroundColorSpan(color), i, i + subtext.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } 

Si desea más control, es posible que desee comprobar la clase TextPaint . Aquí es cómo usarlo:

 final ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(final View textView) { //Your onClick code here } @Override public void updateDrawState(final TextPaint textPaint) { textPaint.setColor(yourContext.getResources().getColor(R.color.orange)); textPaint.setUnderlineText(true); } }; 

Siempre encuentro útiles ejemplos visuales cuando bash entender un nuevo concepto.

Color de fondo

enter image description here

 SpannableString spannableString = new SpannableString("Hello World!"); BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW); spannableString.setSpan(backgroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannableString); 

Color de primer plano

enter image description here

 SpannableString spannableString = new SpannableString("Hello World!"); ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); spannableString.setSpan(foregroundSpan, 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannableString); 

Combinación

enter image description here

 SpannableString spannableString = new SpannableString("Hello World!"); ForegroundColorSpan foregroundSpan = new ForegroundColorSpan(Color.RED); BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(Color.YELLOW); spannableString.setSpan(foregroundSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(backgroundSpan, 3, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(spannableString); 

Estudio adicional

  • Explicar el significado de banderas Span como SPAN_EXCLUSIVE_EXCLUSIVE
  • Android distribuido, SpannedString, Spannable, SpannableString y CharSequence

Establezca el texto de su texto de texto divisible y defina un ForegroundColorSpan para su texto.

 TextView textView = (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); textView.setText(wordtoSpan); 

Otra forma que podría usarse en algunas situaciones es establecer el color del enlace en las propiedades de la vista que está tomando Spannable.

Si su Spannable se va a usar en un TextView, por ejemplo, puede establecer el color del enlace en el XML de esta manera:

  

También puedes configurarlo en el código con:

 TextView tv = (TextView) findViewById(R.id.myTextView); tv.setLinkTextColor(your_color); 

Hay una fábrica para crear el Spannable, y evitar el reparto, así:

 Spannable span = Spannable.Factory.getInstance().newSpannable("text"); 

Establezca Color en texto pasando Cadena y color :

 private String getColoredSpanned(String text, String color) { String input = "" + text + ""; return input; } 

Configure el texto en TextView / Button / EditText, etc. llamando al siguiente código:

Vista de texto:

 TextView txtView = (TextView)findViewById(R.id.txtView); 

Obtener cadena coloreada:

 String name = getColoredSpanned("Hiren", "#800000"); 

Establecer texto en TextView:

 txtView.setText(Html.fromHtml(name)); 

Hecho

  1. crear vista de texto en su diseño
  2. pega este código en tu actividad principal

     TextView textview=(TextView)findViewById(R.id.textviewid); Spannable spannable=new SpannableString("Hello my name is sunil"); spannable.setSpan(new ForegroundColorSpan(Color.BLUE), 0, 5, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); textview.setText(spannable); //Note:- the 0,5 is the size of colour which u want to give the strring //0,5 means it give colour to starting from h and ending with space ie(hello), if you want to change size and colour u can easily 
 private SpannableString spannableString(SpannableString spannableString, int start, int end) { ColorStateList redColor = new ColorStateList(new int[][]{new int[]{}}, new int[]{0xffa10901}); TextAppearanceSpan highlightSpan = new TextAppearanceSpan(null, Typeface.BOLD, -1, redColor, null); spannableString.setSpan(highlightSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new BackgroundColorSpan(0xFFFCFF48), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new RelativeSizeSpan(1.5f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return spannableString; } SpannableString spannableString = new SpannableString("I don't like Hasina."); spannableString(spannableString, 8, 14); textView.setText(spannableString); 

Salida:

enter image description here

Solo para agregar a la respuesta aceptada, ya que todas las respuestas parecen hablar solo de android.graphics.Color : ¿y si el color que deseo está definido en res/values/colors.xml ?

Por ejemplo, considere los colores de diseño de materiales definidos en colors.xml :

 < ?xml version="1.0" encoding="utf-8"?>  #2196F3  

( android_material_design_colours.xml es tu mejor amigo)

Luego use ContextCompat.getColor(getContext(), R.color.md_blue_500) donde usaría Color.BLUE , de modo que:

 wordtoSpan.setSpan(new ForegroundColorSpan(Color.BLUE), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

se convierte en:

 wordtoSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.md_blue_500)), 15, 30, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

Donde encontré eso:

  • Trabajando con tramos en Android – Michael Spitsin – Medium