Android TextView 添加部分文字高亮,点击功能

如图,这里我想要的应用场景大概就是2处。

1. 图中"#教父#"表示的话题性质的内容;

2. 图中"@你我零距离"表示用户昵称的内容。

基本这些新浪微博客户端也都有。

 

话题的实现方式:

1. 检查帖子内容中是否包含双井号,有的话取出开始和结束位置,还有双井号包含的内容。

  /**
     *识别字符串中的话题,话题是双"#"包含的一段文本
     * */
    public static boolean containsTopic(String content){
        if(content==null){
            return false;
        }
        return content.matches(".*\\#.+\\#.*");
    }
  
    public static Topic getTopicStartEnd(String content){
        Pattern pattern = Pattern.compile("\\#.+?\\#");

        Matcher m = pattern.matcher(content);
        if(m.find()){
            Topic t = new Topic();
            t.setStart(m.start());
            t.setEnd(m.end());
            t.setTopicText(m.group());
            System.out.println("start-end:"+m.start()+"-"+m.end()+":"+m.group());
            return t;
        }else{
            return null;
        }
    }

上图代码我只是测试可行性,未完善的思考,比如,我只取了1个话题,而内容中可能包含多个话题或者说多个#井号的情况未考虑。

另外有一点,什么正则表达式的几种用法也没深究,什么贪婪、侵占、勉强什么的。参考:http://www.cppblog.com/biao/archive/2010/02/05/107298.html

2. 使用 ClickableSpan 

              ClickableSpan span = new ClickableSpan() {
                            @Override
                            public void onClick(View widget) {
                                Topic tc = (Topic)widget.getTag();//setTag用于传递数据
                                Log.d("spannn","click......................"+tc.getTopicText());
                            }
                        };
                        content.setTag(c);
                        content.setMovementMethod(LinkMovementMethod.getInstance());
                        Spannable wordtoSpan = new SpannableString(contentText);
                        wordtoSpan.setSpan(span, c.getStart(), c.getEnd(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
                        content.setText(wordtoSpan);

 

用户昵称的处理方式基本也是这样。

 

posted @ 2015-05-28 15:28  韩宏敏  阅读(2012)  评论(0编辑  收藏  举报