最近反编译了别人的产品代码,看到了SpannableStringBuilder的 setSpan 方法,android中的文档定义是
public void setSpan (Object what, int start, int end, int flags)
Since: API Level 1
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.
在应用中实际的使用就是文本加下划线,要网页链结一样,在网上找到了类似这样的代码
public void underline(int start,int end){
SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());
CharacterStyle span=new UnderlineSpan();
spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setText(spannable);
}
但是当我点这些下划线时,Activity是怎么响应并跳转的呢?
秘密是在 TextView中设定了这个
TextView.setText(localSpannableStringBuilder1);
TextView.setMovementMethod(LinkMovementMethod.getInstance());
这样是通过方法LinkMovementMethod去调用实际的响应,我又在网上查到了某个大牛写的关于这个方法的用法
它实现了一系列的方法,
比如它的onKeyDown调用ClickableSpan的onClick
URLSpan实现了ClickableSpan
用户点击一个url的话,就会调用LinkMovementMethod::onKeyDown,继而调用URLSpan的onClick,
我们看看URLSpan::onClick的实现
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
它实际上是启动了一个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,并最终找到了点击的响应方法。
一个初学者就这样完成了一个问题的解决,不断的查询资料,并将其串起来,这是不是一种好的学习方式呢?
public void setSpan (Object what, int start, int end, int flags)
Since: API Level 1
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.
在应用中实际的使用就是文本加下划线,要网页链结一样,在网上找到了类似这样的代码
public void underline(int start,int end){
SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());
CharacterStyle span=new UnderlineSpan();
spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
setText(spannable);
}
但是当我点这些下划线时,Activity是怎么响应并跳转的呢?
秘密是在 TextView中设定了这个
TextView.setText(localSpannableStringBuilder1);
TextView.setMovementMethod(LinkMovementMethod.getInstance());
这样是通过方法LinkMovementMethod去调用实际的响应,我又在网上查到了某个大牛写的关于这个方法的用法
它实现了一系列的方法,
比如它的onKeyDown调用ClickableSpan的onClick
URLSpan实现了ClickableSpan
用户点击一个url的话,就会调用LinkMovementMethod::onKeyDown,继而调用URLSpan的onClick,
我们看看URLSpan::onClick的实现
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
它实际上是启动了一个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,并最终找到了点击的响应方法。
一个初学者就这样完成了一个问题的解决,不断的查询资料,并将其串起来,这是不是一种好的学习方式呢?