Android SpannableString实现富文本展现

在Android开发中,有许多信息展示需要通过TextView来展现,如果只是普通的信息展现,使用TextView setText(CharSequence str)设置即可,但是当在TextView里的这段内容需要截取某一部分字段,可以被点击以及响应响应的操作,这时候就需要用到SpannableString了,下面通过一段简单的代码实现部分文字被点击响应,及富文本表情的实现。

 

public class MainActivity extends Activity {
	private TextView tv,tv1;
	static Context ctx = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//富文本点击响应
		tv = (TextView)findViewById(R.id.tv);
		tv.setTextSize(20);
		tv.setText(getClickableSpan());
		tv.setMovementMethod(LinkMovementMethod.getInstance());
		
		//添加了普通字符串和表情的展示
		tv1 = (TextView)findViewById(R.id.tv1);
		tv1.setText(transferBiaoQing("hello android",R.drawable.ic_launcher));
	}

	private SpannableString getClickableSpan() {
		View.OnClickListener l = new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(MainActivity.this, "Click Success",
						Toast.LENGTH_SHORT).show();
			}
		};

		SpannableString spanableInfo = new SpannableString(
				"This is a test, Click Me");
		int start = 16;
		int end = spanableInfo.length();
		spanableInfo.setSpan(new Clickable(l), start, end,
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		return spanableInfo;
	}

	/**
	 * 内部类,用于截获点击富文本后的事件
	 * @author pro
	 *
	 */
	class Clickable extends ClickableSpan implements OnClickListener {
		private final View.OnClickListener mListener;

		public Clickable(View.OnClickListener l) {
			mListener = l;
		}

		@Override
		public void onClick(View v) {
			mListener.onClick(v);
		}
		@Override
	    public void updateDrawState(TextPaint ds) {
	        ds.setColor(ds.linkColor);
	        ds.setUnderlineText(false);    //去除超链接的下划线
	    }
	}
	
	/**
	 * 将富文本转成CharSequence
	 * @param commonStr 普通内容
	 * @param bqId  表情图片
	 * @return
	 */
    public CharSequence transferBiaoQing(String commonStr,int bqId) {
        return Html.fromHtml(commonStr+"", imageGetter, null);
    }
 
    /**
     * 获取本地图片资源
     */
    private ImageGetter imageGetter = new ImageGetter() {
        @Override
        public Drawable getDrawable(String source) {
            int id = Integer.parseInt(source);
            // 根据id从资源文件中获取图片对象
            Drawable d = MainActivity.this.getApplicationContext().getResources().getDrawable(id);
            // 以此作为标志位,方便外部取出对应的资源id
            d.setState(new int[] { id });
            d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
            return d;
        }
    };
}

 

实现效果如下


Android SpannableString实现富文本展现_第1张图片
 

你可能感兴趣的:(Android)