zoukankan      html  css  js  c++  java
  • 实现微博@@@

     首先来看看新浪微博client界面如下图所示:


        每转发一次都会添加一个@xxx,而点击@xxx则进入该用户具体资料界面,点击其它地方则进入的是微博正文,这个怎么实现呢,仅仅用TextView行吗?答案肯定是不行的!

        先分析下它这个过程是怎么实现的,个人认为,当公布一条微博后,这条微博记录所相应的服务端的表中,会实用户个人信息,以及转发时的评论内容即这一部分(这一部分内容事实上能够是一个字符串),还应有一个被转发人列表能够是json格式的字段(包括被转发人的id和昵称),当下一个用户转发这条微博时。会获取这个被转发人列表字段,转发成功后会将自己的id及昵称保存在这个字段中并传给server。而client在显示被转发的微博时,除了获取到转发评论内容,还会获取到这个被转发人列表字段中包括的转发人id及昵称,然后通过特殊方法,将转发评论内容中的@XXX根据被转发人列表转换为可点击。

        网上也有不少方法实现,但本人认为不够全面。因此写下这篇文章及demo,供刚開始学习的人学习。水平有限。不足之处还望各位见谅。

        一下是本人demo执行效果图:


    下面是主程序中的onCreate方法:

    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		LinearLayout ll=(LinearLayout) findViewById(R.id.ll);
    		ll.setOnClickListener(new OnClickListener() {
    			@Override
    			public void onClick(View arg0) {
    				 Toast.makeText(MainActivity.this, "点击了LinearLayout", Toast.LENGTH_SHORT).show();
    			}
    		});
    		
    		tv = (TextViewFixTouchConsume) this.findViewById(R.id.myTextView);
    		List<String> textList=new ArrayList<String>();
    		textList.add("张三");
    		textList.add("李四");
    		textList.add("王五");
    		CharSequence str=replace("@张三:哈哈哈啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈//@李四:哈哈哈啊哈哈哈哈哈哈哈哈哈哈阿斯顿发生地方哈哈哈//@王五:你好啊哈哈哦啊好好",textList);
    		tv.setText(str);
    		tv.setMovementMethod(LinkMovementMethod.getInstance());
    }
    当中TextViewFixTouchConsume为重写的TextView,textList事实上就是上面所讲到的被转发人列表,通过从服务端获取的数据解析后一一加入进list,然后在replace方法中会运行一个方法:

    public  String getLinkString(String text, List<String> textList) {
    		for(int i=0; i<textList.size();i++){
    			text=text.replace("@" + textList.get(i), "<a href='" + textList.get(i) + "'>" + "@" + textList.get(i) + "</a>");
    		}
            return text;
    }
    即将转发评论内容中的全部@xxx依据获取的被转发人列表中的昵称替换为<a href=“xxx”>@xxx</a>,之后通过Html.fromHtml将其格式化,再通过下面操作:

    SpannableStringBuilder builder = new SpannableStringBuilder(text);
                    if (text instanceof Spannable) {
                            int end = text.length();
                            // 事实上就是得到sp1
                            Spannable sp = (Spannable) text;
                            // 得到当中全部的keyword的数组
                            URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
                            // 清楚掉全部的keyword标志
                            builder.clearSpans();
                            for (URLSpan url : urls) {
                                    // 将keyword数组中的文字加入到新生成的style中去
                                    MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
                                    builder.setSpan(myURLSpan, sp.getSpanStart(url),
                                                    sp.getSpanEnd(url),
                                                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                            }
                    }
            return builder;

    即达到效果,当中的MyURLSpan继承自ClickableSpan,当中重写了onClick点击事件:

            public void onClick(View widget) {
                    //这里面可实现界面跳转等操作
                    String nickName = mUrl.trim().substring(0);
                    Toast.makeText(MainActivity.this, nickName, Toast.LENGTH_SHORT).show();
            }

    源代码下载地址:http://download.csdn.net/detail/baiyuliang2013/7942089

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    idea控制台乱码问题解决
    部署springboot项目到云服务器的两种方式(jar+war)
    case...when...then....(else...)....end的使用小案例
    多线程学习(二)
    多线程学习(一)
    Swagger学习笔记
    Docker进阶篇
    Docker入门基础篇
    Markdown语法学习(推荐使用Typora编辑器)
    git(六)——IDEA中使用git
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4749021.html
Copyright © 2011-2022 走看看