我们在app开发中有时候会遇到一段文案中某段文字需要点击事件,这个时候我们可以用多个控件来实现这个功能,但是用多个控件实现会出现适配的问题,而且也会影响到app的性能。
我今天要讲的用一个TextView 然后给其中的某段文字设置点击事件就能完美的解决这个问题。
废话不多说先上代码: 布局代码
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="@color/b2"
android:text="@string/activity_home_text"
/>
</android.support.constraint.ConstraintLayout>
public class HomeActivity extends BaseActivity {
@Override
protected int getLayoutId() {
return R.layout.activity_home;
}
@Override
protected void initView() {
TextView textView = findViewById(R.id.tv_text);
String str = getString(R.string.activity_home_text);
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(str);
TextViewSpan1 span1 = new TextViewSpan1();
stringBuilder.setSpan(span1,3,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
TextViewSpan2 span2 = new TextViewSpan2();
stringBuilder.setSpan(span2,15,18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
//一定要记得设置这个方法 不是不起作用
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
private class TextViewSpan1 extends ClickableSpan {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(getResources().getColor(R.color.main_nav_bg_start));
//设置是否有下划线
ds.setUnderlineText(true);
}
@Override
public void onClick(View widget) {
//点击事件
ToastUtil.showToast("这是测试点击1");
}
}
private class TextViewSpan2 extends ClickableSpan {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(getResources().getColor(R.color.main_nav_bg_end));
//设置是否有下划线
ds.setUnderlineText(false);
}
@Override
public void onClick(View widget) {
//点击事件
ToastUtil.showToast("这是测试点击2");
}
}
}
这个主要是继承 ClickableSpan 这个类
然后重写 updateDrawState 这个方法 在里面设置字体颜色什么的;
重写 onClick 方法设置点击响应事件。
最后一定要记得在设置完了之后设置这个 不是点击事件是不起作用了
//一定要记得设置这个方法 不是不起作用
textView.setMovementMethod(LinkMovementMethod.getInstance());
方法基本就是这样的。