2012-03-09 8 views
9

¿Hay alguna forma de establecer el color de un recurso de cadena en Android? Quiero decir, sé que puedo usar algunas etiquetas html para cambiar el estilo de cadena (o subcadenas) pero no he encontrado ninguna para cambiar el color. He visto otras soluciones aquí en stackoverflow, como pasar la cadena a Html.fromHtml (cadena) antes de configurar el texto, pero quiero hacerlo en el editor de recursos de cadenas. ¿Cualquier posibilidad?Cambiar el color de la palabra en la cadena de recursos

Respuesta

10

Por lo que yo sé que no es posible. Yo usaría SpannableString para cambiar el color.

int colorBlue = getResources().getColor(R.color.blue); 
    String text = getString(R.string.text); 
    SpannableString spannable = new SpannableString(text); 
    // here we set the color 
    spannable.setSpan(new ForegroundColorSpan(colorBlue), 0, text.length(), 0); 

Spannable es realmente agradable. Puede establecer think like fontseize y esas cosas allí y simplemente adjuntarlo a una vista de texto. La ventaja es que puede tener diferentes colores en una vista.

Edit: Ok, si solo quiere establecer el color de la solución mencionada anteriormente, yo soy el camino a seguir.

+0

Veo, si este es el camino a seguir, podría crear mis recursos de cadena con algún "código" para saber dónde comienza y dónde termina la subcadena que quiero cambiar, y procesarla de la manera que expuso. Gracias. – Notbad

+0

'int colorBlue = getResources(). GetColor (R.color.blue); .... spannable.setSpan (nuevo ForegroundColorSpan (colorBlue), 0, text.length(), 0); 'se puede reemplazar por una sola línea como esta' spannable.setSpan (new ForegroundColorSpan (R.color.blue). .'' –

+0

Además, yo personalmente usaría las constantes de indicador declaradas en la clase activable en lugar de la codificación dura 0 durante la llamada. Hace que el código sea más legible y mantenible. Solo algo que haría ... –

1

Las cadenas en sí no tienen color, pero puede cambiar el color del texto en el texto en el que aparecen. Consulte el textview documentation, pero hay 2 formas de hacerlo.

XML

android:textColor 

Código

setTextColor(int) 
+0

Gracias por la respuesta. Creo que no estaba bien formulado. Me referí a cambiar el color de una subcadena en la cadena de recursos. Lo siento por eso. – Notbad

19

Parece que this método está funcionando:

<string name="some_text">this is <font fgcolor="#ffff0000">red</font></string> 
+7

Parece que ha dejado de funcionar en 4.3 (posiblemente antes) - ¿Alguien sabe qué pasa? –

+5

[Por qué dejó de funcionar] (https://code.google.com/p/android/issues/detail?id=58192), [cómo dejó de funcionar] (https://github.com/android/platform_frameworks_base/commit/a8f6d5f0720f400b6f59b0809aaefea83c5f51d4), [una buena solución/implica código: (] (http://stackoverflow.com/a/18839246/253468) y una solución fea: para cualquier color arriba '7fffffff' aplique lo siguiente:' 'ponga' ff6890a5' en una calculadora (opti onally convertir a decimal primero) y voltear el signo, luego (opcionalmente volver a convertir a hexa) tomar los últimos 8 dígitos hexadecimales y usar ''. – TWiStErRob

+1

OK, ahora ** QUE ** fue malditamente brillante. Funcionó perfectamente. Muchas gracias y ojalá hubiera sabido sobre esto hace mucho tiempo. –

0

me han hecho recientemente una solución flexible para este problema. Me permite agregar fácilmente múltiples estilos a subcadenas utilizando el método de encadenamiento. Hace uso de SpannableString. Cuando quiera darle un color a cierta subcadena, puede usar ForegroundColorSpan.

public StyledString putColor(String subString, @ColorRes int colorRes){ 
    if(getStartEnd(subString)){ 
     int color = ColorUtil.getColor(context, colorRes); 
     ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(color); 
     fullStringBuilder.setSpan(foregroundColorSpan, startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 
    return this; 
} 

Para ver el código completo, ver gist.

+0

Si bien un enlace es excelente, por favor [proporcione contexto a su (s) enlace (es)] (http://meta.stackoverflow.com/a/8259/169503), ya que una * respuesta * en realidad debería contener una respuesta. Tenga en cuenta que se * poco más que un enlace a un sitio externo * es una posible razón de por [¿Por qué y cómo se eliminan algunas respuestas?] (Http://stackoverflow.com/help/deleted-answers). – Jan

Cuestiones relacionadas