需求
一段文本里,有多个标签和多个链接,标签跳转到标签页,链接跳转到Web页
实现
1. 约定特殊的格式
标签类型:<e type="hashtag" hid="标签id" title="周杰伦打call" >
网页类型:<e type="web" title="图片链接" " href="https://movie.douban.com">
2. 主要代码
/**
* 将文本中的自定义标签与链接转换为特殊的标识
*
* @param contentStr
* @return 返回标签对象作它用
*/
public static SpannableInfo replaceEmoji(final Context context, SpannableStringBuilder spannableString, String contentStr, int textSize, final boolean onlyImg) {
if (spannableString == null) {
spannableString = new SpannableStringBuilder();
}
SpannableInfo spannableInfo = new SpannableInfo();
if (!TextUtils.isEmpty(contentStr)) {
contentStr = trim(contentStr);
//如果包含多条链接和话题就分割了做,暂时没有想到好法子
if (contentStr.contains(">")) {
String[] datas = contentStr.split(">");
int index = 0;
for (String data : datas) {
index++;
if (index < datas.length) {
data += ">";
}
SpannableStringBuilder builder = replaceSingle(context, spannableInfo, data, textSize, onlyImg);
spannableString.append(builder);
}
} else {
SpannableStringBuilder builder = replaceSingle(context, spannableInfo, contentStr, textSize, onlyImg);
spannableString.append(builder);
}
}
spannableInfo.setBuilder(spannableString);
return spannableInfo;
}
/**
* 逐条分割网络链接
* @param context
* @param spannableInfo
* @param contentData
* @param textSize
* @param onlyImg
* @return
*/
public static SpannableStringBuilder replaceSingle(final Context context, SpannableInfo spannableInfo, String contentData, int textSize, final boolean onlyImg) {
String regex_http = "<e type=\"web\".*>";
Pattern pattern = Pattern.compile(regex_http, Pattern.CASE_INSENSITIVE);
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append(contentData);
Matcher matcher = pattern.matcher(spannableString);
//find会在整个输入中寻找是否有匹配的子字符串
while (matcher.find()) {
try {
String content = spannableString.subSequence(matcher.start(), matcher.end()).toString();
final String url = getUrl(content);
final String title = getWebTitle(content);
boolean showOnlyImg = false;
if (!TextUtils.isEmpty(title) && title.equals("「查看图片」") && onlyImg) {
showOnlyImg = true;
}
//链接前带的图标
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), showOnlyImg ? R.drawable.trans : R.drawable.link_icon);
//设置表情显示的大小
if(showOnlyImg){
textSize = 5;
}
bitmap = Bitmap.createScaledBitmap(bitmap, textSize, textSize, true);
ImageSpan imageSpan = new ImageSpan(context, bitmap, DynamicDrawableSpan.ALIGN_BASELINE);
spannableString.setSpan(imageSpan, matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
SpannableString string = new SpannableString(TextUtils.isEmpty(title) ? " 网页链接" : title);
if(matcher.start() >= 0){
string.setSpan(new StyleSpan(Typeface.BOLD), 0,string.toString().length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
spannableString.insert(matcher.end(), string);
NfClickableSpan clickableSpan = new NfClickableSpan(context.getResources().getColor(showOnlyImg ? R.color.blue_56 : R.color.blue_56)) {
@Override
public void onClick(View widget) {
if (!TextUtils.isEmpty(title) && title.equals("「查看图片」")) {
JumpTo.getInstance().commonJump(context, ViewBigPhotoActivity.class, url);
} else {
try {
if(isSymlink(new File(url))){
SUtils.makeToast(context,"url"+url);
}else{
Intent intent = new Intent(context, WebContainerActivity.class);
intent.putExtra(JumpTo.TYPE_STRING, url);
intent.putExtra("key_title", title);
context.startActivity(intent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
int end = matcher.end() + string.toString().length();
spannableString.setSpan(clickableSpan, matcher.end() - 1, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (NullPointerException e) {
e.printStackTrace();
continue;
}
}
return replaceTags(context,spannableInfo, spannableString);
}
3. 解析标签
/**
* 将文本中的Tag转换
*
* @return
*/
public static SpannableStringBuilder replaceTags(final Context context, SpannableInfo spannableInfo, SpannableStringBuilder spannableString) {
if (spannableString == null) {
spannableString = new SpannableStringBuilder();
}
String regex_http = "<e type=\"hashtag\".*>";
Pattern pattern = Pattern.compile(regex_http, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(spannableString);
//find会在整个输入中寻找是否有匹配的子字符串
while (matcher.find()) {
try {
final String content = spannableString.subSequence(matcher.start(), matcher.end()).toString();
final String url = getUrl(content);
final String title = getWebTitle(content);
final String hid = match(content, "e", "hid");
String finalContent = "#" + title + "#";
SpannableString imageSpan = new SpannableString(finalContent);
if (spannableInfo != null && spannableInfo.getSubjectInfo() == null) {
SubjectInfo subjectInfo = new SubjectInfo();
subjectInfo.setId(hid);
subjectInfo.setTitle(title);
spannableInfo.setSubjectInfo(subjectInfo);
}
if (!TextUtils.isEmpty(hid)) {
imageSpan.setSpan(new ForegroundColorSpan(Color.parseColor("#5620F0")), 0, finalContent.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
imageSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, finalContent.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
spannableString.replace(matcher.start(), matcher.end(), imageSpan);
NfClickableSpan clickableSpan = new NfClickableSpan(Color.parseColor("#5620F0")) {
@Override
public void onClick(View widget) {
SUtils.makeToast(context,"点击了标签");
}
};
spannableString.setSpan(clickableSpan, matcher.start(), matcher.start()+finalContent.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} catch (NullPointerException e) {
e.printStackTrace();
continue;
}
}
return spannableString;
}
网友评论