Aplicar dos estilos de fuente diferentes a un TextView
Quiero aplicar dos estilos de fuente diferentes a un texto en un único TextView.
Mi caso es el mismo que Android – dos frases, dos estilos, un TextView . La única diferencia es que quiero configurar una fuente personalizada en todo el texto. He incluido Helvetica Font como un activo en mi proyecto y quiero aplicar esa fuente a la TextView con la primera parte del texto será Helvetica BOLD y parte restante Helvetica NORMAL. ¿Alguna sugerencia de cómo se puede hacer?
- La fuente personalizada en Android se procesa de forma diferente en diferentes API
- Android: WebView con fuente personalizada
- ¿Qué personajes están disponibles en Android?
- Valores válidos para android: fontFamily y para qué se correlacionan?
- Uso de fuentes tipo otf en el estudio de Android
Texto necesario en el siguiente formato. Texto de encargo con diversos estilos y solo textview.
- Fuente Roboto en mi aplicación para Android
- Android - Hindi Conjuntos de Apoyo?
- Cómo evitar el cambio de fuente TextView, cuando cambiamos el estilo de fuente del dispositivo en dispositivos Samsung
- ¿Cómo Android conjunto de fuentes personalizadas en la lona?
- Establecer el texto Gujarati en Spinner en Android
- ¿Qué fuentes están disponibles en Android?
- Idiomas de indicador en el navegador de Android / GUI (Gujarati) interpretación incorrecta
- En Photoshop el tamaño de fuente de archivo es 20px ¿qué sp será para esto en android? ¿Es igual? Significa 20px = 20sp o algo más?
Una forma de hacerlo es extender TypefaceSpan :
import android.graphics.Paint; import android.graphics.Typeface; import android.text.TextPaint; import android.text.style.TypefaceSpan; public class CustomTypefaceSpan extends TypefaceSpan { private final Typeface newType; public CustomTypefaceSpan(String family, Typeface type) { super(family); newType = type; } @Override public void updateDrawState(TextPaint ds) { applyCustomTypeFace(ds, newType); } @Override public void updateMeasureState(TextPaint paint) { applyCustomTypeFace(paint, newType); } private static void applyCustomTypeFace(Paint paint, Typeface tf) { int oldStyle; Typeface old = paint.getTypeface(); if (old == null) { oldStyle = 0; } else { oldStyle = old.getStyle(); } int fake = oldStyle & ~tf.getStyle(); if ((fake & Typeface.BOLD) != 0) { paint.setFakeBoldText(true); } if ((fake & Typeface.ITALIC) != 0) { paint.setTextSkewX(-0.25f); } paint.setTypeface(tf); } }
A continuación, cuando desee utilizar dos tipos de letra diferentes, llame a:
String firstWord = "first "; String secondWord = "second"; // Create a new spannable with the two strings Spannable spannable = new SpannableString(firstWord+secondWord); // Set the custom typeface to span over a section of the spannable object spannable.setSpan( new CustomTypefaceSpan("sans-serif",CUSTOM_TYPEFACE), 0, firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan( new CustomTypefaceSpan("sans-serif",SECOND_CUSTOM_TYPEFACE), firstWord.length(), firstWord.length() + secondWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // Set the text of a textView with the spannable object textView.setText( spannable );
Esto puede funcionar: cree su propio TextView personalizado y luego utilice un StyleSpan en una parte de él:
public class CustomTextView extends TextView { public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void setTypeface(Typeface tf, int style) { if (style == 1){ //replace "HelveticaBOLD.otf" with the name of your bold font tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaBOLD.otf"); }else{ //replace "HelveticaNORMAL.otf" with the name of your normal font tf = Typeface.createFromAsset(getContext().getApplicationContext().getAssets(), "HelveticaNORMAL.otf"); } super.setTypeface(tf, 0); } }
Y entonces usted puede hacer algo como:
int index1 = 0; //wherever bold should begin int index2 = 5; //wherever bold should end Spannable span = new SpannableString("some string"); span.setSpan(new StyleSpan(Typeface.BOLD),index1, index2,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); ((CustomTextView)findViewById(R.id.yourTextView)).setText(span);
Puede crear una vista personalizada y renderizar el texto con dos objetos Paint utilizando el método canvas.drawText
Aquí hay una solución más sencilla, puede utilizar HTML para establecer diferentes estilos en el mismo TextView
.
Por ejemplo:
// Styled label String styledText = "<big><b><font color='#333333'>title</font></b></big> <small><b><font color='#CC5490'>subtitle</font></b></small>"; // Apply the styled label on the TextView textView.setText(Html.fromHtml(styledText));
Necesita la siguiente importación:
import android.text.Html;
Yo uso este enfoque
class FooClass { void Foo() { textViewSetText(R.id.photo_title, "Title: ", photo.getTitle()); textViewSetText(R.id.photo_tags, "Tags: ", photo.getTags()); textViewSetText(R.id.photo_author, "Author: ", photo.getAuthor()); } private void textViewSetText(int resourceId, String prefix, String text) { TextView textView = (TextView) findViewById(resourceId); SpannableString styledText = new SpannableString(prefix); styledText.setSpan(new StyleSpan(Typeface.BOLD), 0, prefix.length(), 0); textView.setText(null); textView.append(styledText); textView.append(text); } }
Como se puede ver en " Autor ", " Título " y " Etiquetas " se ajustan a BOLD
Captura de pantalla http://image.prntscr.com/image/dd60bb4a335445c2adca8a4596d7fb32.png
¿Intentó establecer un tipo de letra personalizado en TextView antes de aplicar texto extensible?
Typeface face = Typeface.createFromAsset(ctx.getAssets(), "fonts/boost.ttf") TextView tv = (TextView) ctx.findViewById(id); tv.setTypeface(face);
Y luego aplicar SpannableStringBuilder a partir de la pregunta vinculada – Sólo estoy asumiendo que si su ttf soporta 'normal' y 'negrita' sería render en consecuencia 🙂
- Error al inflar la clase y android.support.v7.widget.CardView
- OnSearchRequested () ya no funciona en Android 4.x +?