最近需要给TextView的几个字段设置设置点击事件,这个应该是很普遍的,也很容易实现的,但是百度了好久都是千篇一律的,设置的开始跟结束位置都是固定写死的必然要(0,5)这样设参,而且不灵活。需要用到的组件有SpannableString,这个组件也有个getSpanStart()跟getSpanEnd()两个方法,这两个开始跟结束的位置怎么使用还不会,一直报空,然后采用比较笨拙的方法,就是将数据源转换成数组,再遍历需要从哪个字段开始的位置
TextView tv; int start = 0; String message = "您的号码是:13628179545"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) this.findViewById(R.id.tv); char[] a = message.toCharArray(); for (int i = 0; i < a.length; i++) { if (a[i] == (':')||a[i] == (':')) { start = i; Message msg = mHandler.obtainMessage(1, i); mHandler.sendMessage(msg); Log.e("tag", "-----start--" + start); return; } } } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { int index = (int) msg.obj; setSpannable(index); } }; private void setSpannable(int index) { SpannableString spannableString = new SpannableString(message); spannableString.setSpan(new Clickable(listener), index + 1, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(spannableString); tv.setMovementMethod(LinkMovementMethod.getInstance()); } View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "试试", Toast.LENGTH_SHORT).show(); } }; class Clickable extends ClickableSpan { View.OnClickListener mListener; public Clickable(View.OnClickListener mListener) { this.mListener = mListener; } @Override public void updateDrawState(TextPaint ds) { // ds.setColor(Color.BLUE);设置字体颜色 } @Override public void onClick(View widget) { mListener.onClick(widget); } } }