2012-11-27 5 views
7

Tôi cố gắng này:Đặt phông chữ và màu sắc khác nhau để một phần của một TextView

String s = "Some big string" 
SpannableStringBuilder sb = new SpannableStringBuilder(s); 
//normal font for 1st 9 chars 
sb.setSpan(robotoRegular, 0,9,Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
//bold font for rest of the chars 
sb.setSpan(robotoBold, 9,s.length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
//also change color for rest of the chars 
sb.setSpan(new ForegroundColorSpan(Color.BLACK), 9,s.length(),Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
textView.setText(sb); 

Nhưng điều này đã không làm việc.

Chỉ mất setSpan mới nhất, tức là .., Màu văn bản đang được thay đổi nhưng không phải phông chữ.

+0

Làm thế nào để bạn xác định 'robotoRegular' và' robotoBold'? –

+0

Biến lớp: ** robotoRegular = Typeface.createFromAsset (getAssets(), "fonts/Roboto-Regular.ttf"); ** –

Trả lời

28

Bạn phải sử dụng một TypefaceSpan thay vì một Typeface.

Nhưng vì bạn đang sử dụng kiểu chữ tùy chỉnh, bạn cần phải mở rộng TypefaceSpan.

Kiểm tra điều này answer và tạo lớp học CustomTypefaceSpan.

Bây giờ làm như sau:

Typeface robotoRegular = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Regular.ttf"); 
Typeface robotoBold = Typeface.createFromAsset(getAssets(), "fonts/Roboto-Bold.ttf"); 

TypefaceSpan robotoRegularSpan = new CustomTypefaceSpan("", robotoRegular); 
TypefaceSpan robotoBoldSpan = new CustomTypefaceSpan("", robotoBold); 

// normal font for 1st 9 chars 
sb.setSpan(robotoRegularSpan, 0, 9, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
// bold font for rest of the chars 
sb.setSpan(robotoBoldSpan, 9, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
// also change color for rest of the chars 
sb.setSpan(new ForegroundColorSpan(Color.BLUE), 9, s.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
textView.setText(sb); 
0

kiểm tra mã này: -

protected void onDraw(Canvas canvas) { 

     Paint circlePaint = new Paint(); 
     Typeface mType = Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC); 
     circlePaint.setTextSize(25); 
     circlePaint.setColor(Color.RED); 
     circlePaint.setTypeface(mType); 
     canvas.drawText("Default Typeface", 50, 100, circlePaint); 
     // 
     circlePaint.setFlags(Paint.UNDERLINE_TEXT_FLAG); 
     circlePaint.setColor(Color.YELLOW); 
     canvas.drawText("Underline Text Flag", 50, 120, circlePaint); 
     // 
     circlePaint.setFlags(Paint.STRIKE_THRU_TEXT_FLAG); 
     circlePaint.setColor(Color.GREEN); 
     canvas.drawText("Strike Thru Text Flag", 50, 140, circlePaint); 
     // 
     circlePaint.setFlags(Paint.ANTI_ALIAS_FLAG); 
     circlePaint.setColor(Color.WHITE); 
     canvas.drawText("Anti Alias Flag", 50, 160, circlePaint); 
     // 
     circlePaint.setFlags(Paint.DEV_KERN_TEXT_FLAG); 
     circlePaint.setColor(Color.WHITE); 
     canvas.drawText("Dev Kern Text Flag", 50, 180, circlePaint); 
     // 
     circlePaint.setFlags(Paint.FAKE_BOLD_TEXT_FLAG); 
     circlePaint.setColor(Color.CYAN); 
     canvas.drawText("Fake Bold Text Flag", 50, 200, circlePaint); 
    } 
0

Đối peaple người thích để làm cho lớp utils cho việc này:

public static SpannableStringBuilder makeTextBold (Activity activity, String string, int fromCharIndex, int toCharIndex) { 
    return makeTextBold(activity, new SpannableStringBuilder(string), fromCharIndex, toCharIndex); 
} 

public static SpannableStringBuilder makeTextBold (Activity activity, SpannableStringBuilder string, int fromCharIndex, int toCharIndex) { 
    SpannableStringBuilder sb = new SpannableStringBuilder(string); 
    Typeface bold = Typeface.createFromAsset(activity.getAssets(), "fonts/NexaBold.ttf"); 
    TypefaceSpan robotoBoldSpan = new CustomTypefaceSpan("", bold); 
    sb.setSpan(robotoBoldSpan, fromCharIndex, toCharIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
    return sb; 
} 

public static SpannableStringBuilder colorText (int resourceId, String string, Activity activity, int fromCharIndex, int toCharIndex) { 
    return colorText(resourceId, new SpannableStringBuilder(string), activity, fromCharIndex, toCharIndex); 
} 

public static SpannableStringBuilder colorText (int resourceId, SpannableStringBuilder sb, Activity activity, int fromCharIndex, int toCharIndex) { 
    sb.setSpan(new ForegroundColorSpan(activity.getResources().getColor(resourceId)), fromCharIndex, toCharIndex, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
    return sb; 
}