美文网首页
(Android)自定义标签与链接在文本中的应用

(Android)自定义标签与链接在文本中的应用

作者: 西厌西厌 | 来源:发表于2019-08-16 16:06 被阅读0次

需求

一段文本里,有多个标签和多个链接,标签跳转到标签页,链接跳转到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;
    }

相关文章

网友评论

      本文标题:(Android)自定义标签与链接在文本中的应用

      本文链接:https://www.haomeiwen.com/subject/cnltsctx.html