Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apply two different font styles to a TextView

I want to apply two different font styles to a text in a single TextView.

My case is same as Android - two sentences, two styles, one TextView. The only difference is that I want to set a Custom Font on the whole text. I have included Helvetica Font as an assets in my project and want to apply that font to the TextView with first part of the text will be Helvetica BOLD and remaining part Helvetica NORMAL. Any suggestions how it can be done ?

Text needed in following format. Custom text with different styles and single textview.

enter image description here

like image 920
rizzz86 Avatar asked Mar 08 '12 14:03

rizzz86


People also ask

Can you have multiple styles inside TextView?

Use multiple widgets if you need precise placement of discrete bits of text. Use inline markup if you, um, need markup inline in a widget. Remember: there is no FlowLayout in Android, so stringing together multiple TextViews to create a paragraph is not truly practical AFAIK.

Can we change the text in TextView?

TextView tv1 = (TextView)findViewById(R. id. textView1); tv1. setText("Hello"); setContentView(tv1);


2 Answers

One way to do this is to extend 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);         }     } 

Then when you want to use two different typefaces call:

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 ); 
like image 141
Ljdawson Avatar answered Oct 11 '22 03:10

Ljdawson


Here is a solution more straightforward, you can use HTML to set different styles on the same TextView.

For example:

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

You need the following import:

import android.text.Html; 
like image 34
Yoann Hercouet Avatar answered Oct 11 '22 02:10

Yoann Hercouet