Files
assistant-android/app/src/main/java/com/gh/common/view/MessageSpannableTextView.java

137 lines
4.0 KiB
Java

package com.gh.common.view;
import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.view.View;
import com.gh.gamecenter.R;
import java.util.ArrayList;
import java.util.List;
public class MessageSpannableTextView extends android.support.v7.widget.AppCompatTextView {
private OnSpannableClickListener mSpannableClickListener;
private final String mStartMarkKey = "{{";
private final String mEndMarkKey = "}}";
private List<MarkData> mMarkList;
public MessageSpannableTextView(Context context) {
super(context);
}
public MessageSpannableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mMarkList = new ArrayList<>();
}
@Override
public void setText(CharSequence text, BufferType type) {
if (TextUtils.isEmpty(text) ||
!text.toString().contains(mStartMarkKey) && !text.toString().contains(mEndMarkKey)) {
super.setText(text, type);
return;
}
mMarkList.clear();
String sText = text.toString();
String[] split = sText.split("\\}\\}");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < split.length; i++) {
String s = split[i];
int p = s.lastIndexOf(mStartMarkKey);
if (p != -1) {
MarkData markData = new MarkData();
String substring = s.substring(p);
String content = s.replace(substring, "");
builder.append(content);
markData.setStart(builder.length() + 1);
String key = substring.replace(mStartMarkKey, " ") + " ";
builder.append(key);
markData.setEnd(builder.length() - 1);
markData.setKey(key);
mMarkList.add(markData);
System.out.println(substring);
System.out.println(s);
} else {
builder.append(s);
if (i != split.length - 1 || sText.substring(sText.length() - 2, sText.length()).equals("}}")) {
builder.append("}}");
}
}
}
SpannableStringBuilder msp = new SpannableStringBuilder(builder);
for (MarkData markData : mMarkList) {
msp.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(getContext().getResources().getColor(R.color.tag_orange));
ds.setUnderlineText(true);
}
@Override
public void onClick(View widget) {
if (mSpannableClickListener != null) {
mSpannableClickListener.onClick(markData.getKey().trim());
}
}
}, markData.getStart(), markData.getEnd(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
setMovementMethod(CustomLinkMovementMethod.getInstance());
super.setText(msp, type);
}
public void setOnSpannableClickListener(OnSpannableClickListener spannableClickListener) {
this.mSpannableClickListener = spannableClickListener;
}
public interface OnSpannableClickListener {
void onClick(String spannableText);
}
class MarkData {
private int start;
private int end;
private String key;
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
}