实现微博@@@

 首先来看看新浪微博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

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

原文地址:https://www.cnblogs.com/blfshiye/p/4749021.html