zoukankan      html  css  js  c++  java
  • 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);

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

  • 相关阅读:
    angularjs事件通信$on,$emit,$broadcast详解
    es6入门7--Set Map数据结构
    ES6函数参数默认值作用域的模拟原理实现与个人的一些推测
    JS判断数组是否包含某元素
    es6入门6--数组拓展运算符,Array.from()基本用法
    js new一个对象的过程,实现一个简单的new方法
    js中的NaN,isNaN与Number.isNaN的区别,如何判断一个值严格等于NaN
    详解 JDK8 新增的日期时间类
    详解 枚举
    详解 动态代理
  • 原文地址:https://www.cnblogs.com/hanhongmin/p/4536021.html
Copyright © 2011-2022 走看看