目录
前言
TextView可以说是Android开发最常用的控件了,官方的控件目前已经能够满足大部分需求了,但是依然会有一小部分小众的需求是官方控件无法满足的,这种情况就需要我们通过自定义来实现了。接下来就通过自定义TextView来实现改变部分文字颜色并且可以点击的效果。
思路
无论做任何事情首先都要先理清楚思路,上面说的效果实现起来主要的思路如下:
1 自定义一个textview,内部提供方法(包括要改变颜色的文本S以及颜色值color两个参数)用来改变部分文字的颜色以及触发点击事件。
2 在方法内部首先判断参数color的值是否为0,在color不为零的情况下再触发为传递过来的参数S改变颜色以及设置点击事件的逻辑。
3 如果S值和目前textview的文本值一致,清空textview原来的值并且将改变颜色之后的参数文本append到textview中。
4 如果textview的文本值包含但不等于S,需要将当前textview的文本值以S为界分成三部分,即S前面部分,S部分以及S后面部分。在将S改变颜色之后需要将这三部分重新append到textview中。
实现
核心代码如下:
//customTextview
public MyTextView setSubTextAndColor(TextClickListener callback,String sub,int color){
SpannableString spanEnd=new SpannableString(sub);
String text=getText().toString();
textClickListener=callback;
if(color!=0){
spanEnd.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
textClickListener.textClick(widget);
//避免点击时出现背景颜色变化
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
((TextView)widget).setHighlightColor(getResources().getColor(android.R.color.transparent,context.getTheme()));
}else {
((TextView)widget).setHighlightColor(getResources().getColor(android.R.color.transparent));
}
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(color);//设置颜色
ds.setUnderlineText(false);//去掉下划线
}
},0,spanEnd.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// setText(text.replace(sub,spanEnd.toString()));
setMovementMethod(LinkMovementMethod.getInstance());//触发点击事件
}
if(sub.equals(text)){
setText("");
append(spanEnd);
return this;
}
if(text.contains(sub)){
setText("");
String fristsub=text.substring(0,text.indexOf(sub));
String endsub=text.substring(text.indexOf(sub)+sub.length());
append(fristsub);
append(spanEnd);
append(endsub);
}
return this;
}
//点击事件设置接口回调,可以区分多个文本
public interface TextClickListener{
void textClick(View view);
}
activity中使用:
//xml
<com.example.mydemos.custom.MyTextView
android:id="@+id/tv_part"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:text="hello abc"
android:textSize="16dp" />
//activity
public class DemoActivity3 extends AppCompatActivity implements MyTextView.TextClickListener {
@BindView(R.id.tv_part)
MyTextView tv_part;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo3);
ButterKnife.bind(this);
int color=getResources().getColor(R.color.colorAccent,getTheme());
tv_part.setSubTextAndColor(this,"hello",color);
}
@Override
public void textClick(View view) {
switch (view.getId()){
case R.id.tv_part:
Toast.makeText(this,"ok",Toast.LENGTH_LONG).show();
break;
}
}
}