Single TextView con texto de colores múltiples

Como dice el título, quiero saber si es posible lograr dos personajes de diferentes colores en un solo elemento de vista de texto.

sí, si formatea la String con font-color propiedad de font-color html , páselo al método Html.fromHtml(your text here)

 String text = "First Color Second Color"; yourtextview.setText(Html.fromHtml(text)); 

Puede imprimir líneas con múltiples colores sin HTML como:

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

Puede usar Spannable para aplicar efectos a su TextView :

Aquí está mi ejemplo para colorear solo la primera parte de un texto de TextView (¡mientras le permite establecer el color de forma dinámica en lugar de codificarlo en una Cadena como en el ejemplo de 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); 

En este ejemplo, puede reemplazar 0xFFFF0000 con un getResources().getColor(R.color.red)

Lo he hecho de esta manera:

Consultar referencia

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"); String surName = getColoredSpanned("Patel","#000080"); 

Establecer texto en TextView de dos cadenas con diferentes colores:

 txtView.setText(Html.fromHtml(name+" "+surName)); 

Hecho

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

Hola chicos, he hecho esto, pruébalo

 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 de ti clase TextViewUtils agrega este método

  /*** * * @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; } 

He escrito un código para otra pregunta que es similar a esta, pero esa pregunta se ha duplicado, así que no puedo responder allí, así que solo estoy poniendo mi código aquí si alguien busca el mismo requisito.

No es un código completamente funcional, necesitas hacer algunos cambios menores para que funcione.

Aquí está el código:

Utilicé la idea @Graeme de usar texto interactivo.

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

Método de color aleatorio:

  private int getRandomColor(){ Random rnd = new Random(); return Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256)); } 

Utilice la clase SpannableBuilder en lugar del formato HTML donde sea posible, ya que es más rápido que el análisis de formato HTML. Ver mi propio punto de referencia “SpannableBuilder vs HTML” en Github ¡Gracias!

Prueba esto:

 mBox = new TextView(context); mBox.setText(Html.fromHtml("" + title + "" + "
" + "" + description + "" + "
" + "" + DateAdded + ""));

¡Respuestas increíbles! Pude usar Spannable para construir texto de color arco iris (por lo que podría repetirse para cualquier conjunto de colores). Este es mi método, si ayuda a alguien:

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

Y luego acabo de establecerTexto (buildRainboxText (pack_name)); Tenga en cuenta que todas las palabras que paso son de menos de 15 caracteres y esto solo repite 5 colores 3 veces. ¡Quisiera ajustar los colores / longitud de la matriz para su uso!

 if (Build.VERSION.SDK_INT >= 24) { Html.fromHtml(String, flag) // for 24 API and more } else { Html.fromHtml(String) // or for older API } 

para 24 API y más (bandera)

 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; 

Más información