TextView实现Rich Text

如果要使用一个TextView中实现多种样式,需要用SpannableStringBuilder设置不同的Span,这些Span用于实现Rich Text,比如粗体,斜体,前景色,背景色,字体大小,字体风格等等

先看看设置后的效果,以下文字显示是用一个TextView来实现的


要想实现上面的效果关键函数就是

/**
     * Mark the specified range of text with the specified object.
     * The flags determine how the span will behave when text is
     * inserted at the start or end of the span's range.
     */
    public void setSpan(Object what, int start, int end, int flags) {
        setSpan(true, what, start, end, flags);
    }
第一个参数:传入一个对象,这些对象可以为:

RelativeSizeSpan 相对字体大小
AbsoluteSizeSpan 绝对字体大小
BackgroundColorSpan 背景色
ForegroundColorSpan 前景色,字体颜色
UnderlineSpan 下划线
URLSpan 超链接
StrikethroughSpan 在文字中划线
StyleSpan 字体风格

第二个参数:开始位置

第三个参数:结束位置

第四个参数:用于控制行为,是一些常量,控制开始和结束的区间



更详细的可以参考:http://developer.android.com/intl/zh-cn/reference/android/text/Spanned.html

布局文件,定义一个TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>
在Activity中设置

package com.example.listviewitem;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.text.util.Linkify;
import android.widget.TextView;

public class TestRichText extends Activity {

	private TextView text;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.rich_text);
		text = (TextView) findViewById(R.id.text);
		SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
		String str1 = "广东省/";
		String str2 = "深圳市/";
		String str3 = "南山区";
		String str4 = "百度";
		int start, end;

		stringBuilder.append(str1);
		start = 0;
		end = str1.length();
		stringBuilder.setSpan(new RelativeSizeSpan(4), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置相对字体大小,相对默认字体
		stringBuilder.setSpan(new ForegroundColorSpan(Color.RED), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置前景色也就是字体颜色
		stringBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置文字样式
		stringBuilder.append(str2);
		start = end;
		end += str2.length();
		stringBuilder.setSpan(new RelativeSizeSpan(3), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		stringBuilder.setSpan(new ForegroundColorSpan(Color.GREEN), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		stringBuilder.setSpan(new StrikethroughSpan(), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 在文字上划线
		stringBuilder.append(str3);
		start = end;
		end += str3.length();
		stringBuilder.setSpan(new RelativeSizeSpan(2), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		stringBuilder.setSpan(new ForegroundColorSpan(Color.BLUE), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		stringBuilder.setSpan(new BackgroundColorSpan(Color.BLACK), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色
		stringBuilder.append(str4);
		start = end;
		end += str4.length();
		stringBuilder.setSpan(new UnderlineSpan(), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置下划线
		stringBuilder.setSpan(new URLSpan("http://www.baidu.com"), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置文字的超链接
		stringBuilder.setSpan(new AbsoluteSizeSpan(40), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置绝对字体大小
		text.setAutoLinkMask(Linkify.ALL);
		text.setText(stringBuilder);
	}
}
如果一行文字中有多种不同的属性,以上例子就可以用上了。

你可能感兴趣的:(android,textview,richtext)