在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;

}

};

}

实现效果如下

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐