一个仿微博TextView 筛选,直接使用的工具类

本文介绍了一个用于Android平台的仿微博TextView筛选工具类,该工具类能够解析并设置微博内容样式,支持@人、话题、表情和URL的识别与点击效果。通过使用正则表达式,它能有效地处理文本中的不同元素,并为用户提供交互式的阅读体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个仿微博TextView 筛选,直接使用的工具类 

package com.example.textviewhtml;

import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TextViewUtils {
    private static final String AT = "@[\u4e00-\u9fa5\\w]+";// @人
    //private static final String TOPIC = "#[\u4e00-\u9fa5\\w]+#";// ##话题
    //private static final String TOPIC = "#[\\p{Print}\\p{InCJKUnifiedIdeographs}&&[^#]]+#";// ##话题
    private static final String TOPIC = "#([^#]+?)#";// ##话题

    private static final String EMOJI = "\\[[\u4e00-\u9fa5\\w]+\\]";// 表情
    private static final String URL = "http://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]";// url
    private static final String REGEX = "(" + AT + ")" + "|" + "(" + TOPIC + ")" + "|" + "(" + URL + ")" ;


    public static class MyClickableSpan extends ClickableSpan {

        @Override
        public void onClick(View widget) {
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setColor(Color.BLUE);
            ds.setUnderlineText(false);
        }

    }
    /**
     * 设置微博内容样式
     * @param context
     * @param source
     * @param textView
     * @return
     */
    public static SpannableString getWeiBoContent(final Context context, String source, TextView textView) {
        SpannableString spannableString = new SpannableString(source);

        //设置正则
        Pattern pattern = Pattern.compile(REGEX);
        Matcher matcher = pattern.matcher(spannableString);

        if (matcher.find()) {
            // 要实现文字的点击效果,这里需要做特殊处理
            textView.setMovementMethod(LinkMovementMethod.getInstance());
            // 重置正则位置
            matcher.reset();
        }

        while (matcher.find()) {
            // 根据group的括号索引,可得出具体匹配哪个正则(0代表全部,1代表第一个括号)
            final String at = matcher.group(1);
            final String topic = matcher.group(2);
            //String emoji = matcher.group(3);
            final String url = matcher.group(3);

            // 处理@符号
            if (at != null) {
                //获取匹配位置
                int start = matcher.start(1);
                int end = start + at.length();
                MyClickableSpan clickableSpan = new MyClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        //这里需要做跳转用户的实现,先用一个Toast代替
                        Toast.makeText(context, "点击了用户:" + at, Toast.LENGTH_LONG).show();
                    }
                };
                spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }

            // 处理话题##符号
            if (topic != null) {
                int start = matcher.start(2);
                int end = start + topic.length();
                MyClickableSpan clickableSpan = new MyClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        Toast.makeText(context, "点击了话题:" + topic, Toast.LENGTH_LONG).show();
                    }
                };
                spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
/*
            if (emoji != null) {
                int start = matcher.start(3);
                int end = start + emoji.length();
                int ResId = EmotionUtils.getImgByName(emoji);
                Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), ResId);
                if (bitmap != null) {
                    // 获取字符的大小
                    int size = (int) textView.getTextSize();
                    // 压缩Bitmap
                    bitmap = Bitmap.createScaledBitmap(bitmap, size, size, true);
                    // 设置表情
                    ImageSpan imageSpan = new ImageSpan(context, bitmap);
                    spannableString.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
            }*/

            // 处理url地址
            if (url != null) {
                int start = matcher.start(3);
                int end = start + url.length();
                MyClickableSpan clickableSpan = new MyClickableSpan() {

                    @Override
                    public void onClick(View widget) {
                        Toast.makeText(context, "点击了网址:" + url, Toast.LENGTH_LONG).show();
                    }
                };
                spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }

        return spannableString;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值