TextView 多文字字体颜色及点击事件

像微信朋友圈点赞功能如:张三、李四、王五、这种格式

最早做法是在layout中创建一个父类容器如linearlayout然后在创建一个子layout,在代码中 通过for循环addView添加到父类容器当中,虽然可以实现效果但是这样无形中会增加很多view控件。

通过SpannableStringBuilder只通过一个textview就可以实现上面的效果。

InvitationLike userLike;
        SpannableStringBuilder builder = new SpannableStringBuilder();
        SpannableString spannableString;
        for(int i=0;i<userLikeList.size();i++){
            userLike=userLikeList.get(i);
            String strUserName="、"+userLike.getUsername();
            spannableString = new SpannableString(strUserName);
            spannableString.setSpan(likeTextViewCliceSpan(userLike), 0, spannableString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            builder.append(spannableString);
        }
        txtUserName.setText(builder.subSequence(1, builder.length()));
        txtUserName.setMovementMethod(LinkMovementMethod.getInstance());

likeTextViewCliceSpan是事件方法

private ClickableSpan likeTextViewCliceSpan(final InvitationLike user_like){
        ClickableSpan clickableSpan=new ClickableSpan() {

            @Override
            public void onClick(View widget) {
                StartPace(user_like.getUtid(),user_like.getUid(),user_like.getUsername());
            }
            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);//根据自己情况设置相应字体颜色
                ds.setColor(mContext.getResources().getColor(R.color.broadcast_list_name));
                ds.setUnderlineText(false);
                ds.clearShadowLayer();
            }
        };
        return clickableSpan;
    }

同理微信中的回复功能也一样实现通过一个textview实现,如果实用多个textview就很难保证字体对齐方式。

微信回复格式

李四回复张三:谢谢

张三:不错啊

这个样式父类必须创建一人上layout,因为有多行,每行是一个textview控件,textviewClickSpan也是事件方法和上面基本一样这里就是粘贴了

private void userCommentList(final int index,LinearLayout linearLike, final List<NewCommentModel> commentList){
        linearLike.removeAllViews();
        NewCommentModel commentModel;
        for(int i=0;i<commentList.size();i++){
            commentModel=commentList.get(i);
            View view=LayoutInflater.from(mContext).inflate(R.layout.view_userlike_txtname,new LinearLayout(mContext));
            final CustomTextView txt_commentContent=(CustomTextView)view.findViewById(R.id.txt_username);
            ForegroundColorSpan replySpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.login_font));
            ForegroundColorSpan contentSpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.login_font));
            SpannableStringBuilder builder = new SpannableStringBuilder();
            SpannableString fromSpannable,spannableReply,toSpannable,contentSpannable;
            if(TextUtils.isEmpty(commentModel.getTousername())){
                fromSpannable = new SpannableString(commentModel.getFromusername()+": ");
                fromSpannable.setSpan(textviewClickSpan(false,commentModel), 0, fromSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append(fromSpannable);
            }else{
                fromSpannable = new SpannableString(commentModel.getFromusername());
                fromSpannable.setSpan(textviewClickSpan(false,commentModel), 0, fromSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append(fromSpannable);
                spannableReply=new SpannableString(mContext.getResources().getString(R.string.etxt_reply_hit));
                spannableReply.setSpan(replySpan, 0, spannableReply.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append(spannableReply);
                toSpannable = new SpannableString(commentModel.getTousername()+": ");
                toSpannable.setSpan(textviewClickSpan(true,commentModel), 0, toSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                builder.append(toSpannable);
            }
            contentSpannable = new SpannableString(commentModel.getContent());
            contentSpannable.setSpan(contentSpan, 0, contentSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            builder.append(contentSpannable);
            txt_commentContent.setText(builder);
            txt_commentContent.setMovementMethod(LinkMovementMethod.getInstance());
            linearLike.addView(view);
        }
    }
时间: 2024-12-10 11:45:26

TextView 多文字字体颜色及点击事件的相关文章

textview设置多种不同的字体颜色和点击事件

最近项目需要用到textview为特定字符设置不同的颜色,如果用不同的控件拼起来的话一行也许没有问题,但是如果换行的话效果就不理想了就像qq空间回复品论的效果,昵称和内容文字颜色不一样,点击事件也不一样. 目前我找到两张方法,效果一样.想用哪种看个人喜好 . 1,使用html格式 String html = "看这里,测试<u>下划线</u>.<i>斜体字</i>.<font color='red'>红色字</font>的格

android textview 中部分内容 颜色 样式 点击事件的设置

// 文本内容 SpannableString ss = new SpannableString(remindtitle); int stringlength = ss.length(); // 设置0-2的字符颜色 ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置2-5的字符链接到电话簿,点击时触发拨号 ss.setSpan(new URLSpan("tel

TextView 设置部分文字颜色及点击事件SpannableString

设置TextView中一部分文字的颜色及点击事件. SpannableString gotoMsgListStr = new SpannableString("消息列表"); gotoMsgListStr.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { startActivity(new Intent(OrderPayStatusActivity.this, MsgListActivi

TextView 下划线/字体/颜色

TextView txtShuoming; SpannableStringBuilder builder =  new SpannableStringBuilder(getResources().getString(R.string.shuoming)); //1.设置字体颜色 builder.setSpan(new ForegroundColorSpan(Color.BLUE), 47,56, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); //2.设置字体风格  

获取TextView中的url并设置点击事件

调用安卓默认的浏览器方法: Intent intent = new Intent(Intent.ACTION_VIEW); System.out.println("跳转到百度"); intent.setData(Uri.parse("http://www.baidu.com")); // intent.setPackage("com.mx.browser");     intent.setPackage("com.uc.browser&

TextView设置文字的颜色

1.今天做项目的时候遇到了一个问题,就是无论我怎么设置textView的文字都不管用呀,半天网上找资料呀,这才解决这个问题呀,其实什么问题只要静下心来就可以好好的实现: 以后是实现的代码: #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UITextView *textview; @end @implementation ViewController

自定义的TextView,使部分内容拥有点击事件,并在点击内容上方出现对应的词义等信息

直接看效果图: 上面图中是一个TextView,注册部分内容(KeyWord)是其拥有点击事件,并通过计算KeyWord的坐标,显示KeyWord的想要的一些信息 /** * 一个TextView中包含一个可以点击的KeyWord(关键词),并通过点击关键词,在对应关键词位置正上方展示关键词对应的解释等逻辑 * @author DuGuang * */ public class MainActivity extends Activity { private KeyWordTextView mTv

textview设置部分文字颜色、点击事件

SpannableStringBuilder spannable = new SpannableStringBuilder(getResources().getString(R.string.home_dialog_reg_protocol));spannable.setSpan(new MyClickableSpan(1),163, 169, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);spannable.setSpan(new MyClickableSpan(2)

textview 改变部分字体颜色

Spannable style = new SpannableStringBuilder(commentsHtml); try { style.setSpan(new ForegroundColorSpan(Color.BLUE),startIndex,endIndex,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }catch (Exception e){ e.printStackTrace(); }finally { holder.comentsConTV.set