免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1567 | 回复: 1
打印 上一主题 下一主题

andorid 中的URLSpan的用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-18 17:33 |只看该作者 |倒序浏览
andorid 中的URLSpan的用法








  最近反编译了别人的产品代码,看到了SpannableStringBuilder的 setSpan 方法,android中的文档定义是
  1. public void setSpan (Object what, int start, int end, int flags)

  2. Since: API Level 1
  3. Mark the specified range of text with the specified object. The flags determine how the span will behave when text is inserted at the start or end of the span's range.
复制代码
在应用中实际的使用就是文本加下划线,要网页链结一样,在网上找到了类似这样的代码
  1. public void underline(int start,int end){
  2. SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());
  3. CharacterStyle span=new UnderlineSpan();
  4. spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  5. setText(spannable);
  6. }
复制代码
但是当我点这些下划线时,Activity是怎么响应并跳转的呢?

秘密是在 TextView中设定了这个
  1. TextView.setText(localSpannableStringBuilder1);
  2. TextView.setMovementMethod(LinkMovementMethod.getInstance());
复制代码
这样是通过方法LinkMovementMethod去调用实际的响应,我又在网上查到了某个大牛写的关于这个方法的用法

它实现了一系列的方法,
比如它的onKeyDown调用ClickableSpan的onClick
URLSpan实现了ClickableSpan
用户点击一个url的话,就会调用LinkMovementMethod:nKeyDown,继而调用URLSpan的onClick,
我们看看URLSpan:nClick的实现
  1.     @Override
  2.     public void onClick(View widget) {
  3.         Uri uri = Uri.parse(getURL());
  4.         Context context = widget.getContext();
  5.         Intent intent = new Intent(Intent.ACTION_VIEW, uri);
  6.         intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
  7.         context.startActivity(intent);
  8.     }
复制代码
它实际上是启动了一个activity,可能是web/email或者其他的满足intent filter/url schema的activity

上面的这段内容让我了解了,实际点击了这些链结后,就会去找满足intent filter/url schema的activity去响应。

我随后又查了intentfilter 的定义

  Intent and Intent Filters
    Android通过一个专门的Intent类来进行界面的切换。Intent描述了程序想做什么(intent,n.意图, 目的, 意向)。数据结构的2个最重要的部分是操作(action)与按照既定规则处理的数据(data)。典型的操作是MAIN (Activity的入口),VIEW,PICK,EDIT,等等。数据用URI表示。例如,查看某人的联系信息,你需要创建一个Intent,使用VIEW操作,数据则是一个指向此人的URI。
    有个相关的类叫IntentFilter。Intent是一个请求来做什么事情;IntentFilter则描述了一个Activity(或下文的IntentReceiver)能处理什么意图。显示某人联系信息的Activity使用了一个IntentFilter,就是说它知道如何处理应用到此人数据的VIEW操作。Activities在AndroidManifest.xml文件中使用IntentFilters。

最后我终于在AndroidManifest.xml找到了响应的Acitivity,并最终找到了点击的响应方法。

一个初学者就这样完成了一个问题的解决,不断的查询资料,并将其串起来,这是不是一种好的学习方式呢?

论坛徽章:
0
2 [报告]
发表于 2011-12-20 11:39 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP