2010-10-27 47 views
48
text = text + CepVizyon.getPhoneCode() + "\n\n" 
      + getText(R.string.currentversion) + CepVizyon.getLicenseText(); 
    activationText.setText(text); 
myTextView.setText(text); 

Quiero cambiar el color de la cadena CepVizyon.getPhoneCode() ... ¿cómo puedo hacer esto?¿cómo puedo cambiar la parte de color de un TextView?

+0

Ver esto: http://stackoverflow.com/questions/ 4897349/android-coloring-part-of-a-string-using-textview-settext –

+0

Posible duplicado de [Establecer el color del lapso de TextView en Android] (http://stackoverflow.com/questions/3282940/set-color-of -textview-span-in-android) – Suragch

+0

@Suragch ¿Cómo sabes que la publicación es más antigua que yo? :) – atasoyh

Respuesta

104

Spannable es más flexible:

String text2 = text + CepVizyon.getPhoneCode() + "\n\n" 
      + getText(R.string.currentversion) + CepVizyon.getLicenseText(); 

Spannable spannable = new SpannableString(text2); 

spannable.setSpan(new ForegroundColorSpan(Color.WHITE), text.length(), (text + CepVizyon.getPhoneCode()).length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

myTextView.setText(spannable, TextView.BufferType.SPANNABLE); 
+1

¡Gracias por esta respuesta! Esto es más parecido a NSAttributedString en iOS :) Para ser aún más flexible, reemplace text.lenght por text2.indexOf (CepVizyon.getPhoneCode()) que le permite ignorar la primera parte de String. – iGranDav

+1

Debería poner '()' después de 'text.length' ya que' length' es un método, no un campo. Lo haría yo mismo, pero las ediciones deben ser de al menos 6 caracteres :) – MSX

+0

Esta es la mejor respuesta con diferencia. –

-3

Una forma es dividir myTextView en unos pocos TextViews, uno de los cuales sería solo para el código del teléfono. Entonces controlar el color de este TextView específico es bastante directo.

+3

Nah, dolor en el culo. El uso de un spannable es el camino correcto. –

54
myTextView.setText(Html.fromHtml(text + "<font color=white>" + CepVizyon.getPhoneCode() + "</font><br><br>" 
      + getText(R.string.currentversion) + CepVizyon.getLicenseText())); 
12

Con respecto a la respuesta de Maneesh, esto funcionará, pero debe agregar y evitar las comillas para el atributo de color.

myTextView.setText(Html.fromHtml(text + "<font color=\"#FFFFFF\">" + CepVizyon.getPhoneCode() + "</font><br><br>" 
      + getText(R.string.currentversion) + CepVizyon.getLicenseText())); 
5

Es bueno para mí!

  Spannable spannable = new SpannableString("ABC In-Network DEF"); 
      String str = spannable.toString(); 
      iStart = str.indexOf("In-Network"); 
      iEnd = iStart + 10;/*10 characters = in-network. */ 

      SpannableString ssText = new SpannableString(spannable); 
      ClickableSpan clickableSpan = new ClickableSpan() { 
       @Override 
       public void onClick(View widget) { 
        //your code at here. 
       } 

       @Override 
       public void updateDrawState(TextPaint ds) { 
        super.updateDrawState(ds); 
        ds.setUnderlineText(true); 
        ds.setColor(getResources().getColor(R.color.green)); 
       } 
      }; 
      ssText.setSpan(clickableSpan, iStart, iEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
      mTextView.setText(ssText); 
      mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
      mTextView.setHighlightColor(Color.TRANSPARENT); 
      mTextView.setEnabled(true); 
7

Si tiene texto estático que necesita color, se puede añadir sin ningún tipo de código a través del archivo de cadenas:

<string name="already_have_an_account">Already have an account? <font color='#01C6DB'>Login</font></string> 

continuación

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="64dp" 
    android:text="@string/already_have_an_account"/> 

resultado

enter image description here

no estoy seguro de qué versiones de API funciona, pero no funciona para api 19 que he probado hasta ahora, por lo que probablemente solo algunas de las versiones de API más recientes admitan esto

Cuestiones relacionadas