热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习GoogleSample如何给TextView增加超链接

今天上午看了如何Google的一个示例代码,学到了一些和TextView相关的知识。消灭了我无知的认为TextView就是显示字的幼稚想法,我对学到了内容简单罗列一下就开始记录:在st

今天上午看了如何Google的一个示例代码,学到了一些和TextView相关的知识。消灭了我无知的认为TextView就是显示字的幼稚想法,我对学到了内容简单罗列一下就开始记录:

说一下,超链接不只是访问网页,也可以是一个电话号码。

先上图:
主界面

点击电话号码

下面开始代码分析


首先先贴一下sample_main.xml的布局文件吧:

<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:context=".MainActivity">


<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">



<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/intro" />



<TextView
android:id="@+id/text_auto_linkify"
style="@style/LinkText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all"
android:text="@string/link_text_auto" />



<TextView
android:id="@+id/text_html_resource"
style="@style/LinkText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>



<TextView
android:id="@+id/text_html_program"
style="@style/LinkText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />



<TextView
android:id="@+id/text_spannable"
style="@style/LinkText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

LinearLayout>
ScrollView>

我们看到一共有5个TextView,这五个TextView就对应布局文件里面的五段话,大家可以回去看一看(因为显示不下,第五段话只显示了一行)。因为每个TextView都有新知识,我们就一个一个的看过来:

第一个TextView

第一段话由一个换行,和一个斜体。而且从布局文件里看到它只是引用了strings.xml里面的字符串资源。我们看一下对应的字符串资源:

    <string name="intro">
This sample illustrates how links can be added to a TextView.
\nThis can be done either automatically by setting the autoLink property
string>

换行大家都能想到,加上\n就可以啦,斜体通过 XXX 这样的形式,就能直接把XXX变成斜体了!


第二个TextView

第二段话就不一样了,它有斜体,而又超链接。先看看它的布局怎么写的:

                            android:id="@+id/text_auto_linkify"
hljs-string">"@style/LinkText"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"wrap_content"
android:autoLink="all"
android:text="@string/link_text_auto" />

相比第一个,除了多了style属性,由一个新的属性 autoLink ,这个属性有什么用?

答:通过这个属性,TextView会自动识别字符串里的URL资源(网址和电话,邮箱之类的),然后自动加超链接。

我们先看看它对应的字符串资源:

<string name="link_text_auto">text_auto_linkify: Various kinds
of data that will be auto-linked.

In this text are some things that are actionable. For instance,
you can click on http://www.google.com and it will launch the
web browser. You can click on google.com too. If you
click on (415) 555-1212 it should dial the phone. Or just write
foobar@example.com for an e-mail link. If you have a URI like
http://www.example.com/lala/foobar@example.com you should get the
full link not the e-mail address. Or you can put a location
like 1600 Amphitheatre Parkway, Mountain View, CA 94043. To summarize:
https://www.google.com, or 650-253-0000, somebody@example.com,
or 9606 North MoPac Expressway, Suite 400, Austin, TX 78759.string>

我们发现就是显示出来的内容,就是加粗部分的文字是通过嵌套标记实现的。看来还是挺简单的,但还有呢!


第三个TextView

我们先看它的布局:

            <TextView
android:id="@+id/text_html_resource"
style="@style/LinkText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

我们看到它没有指定字符串和autoLink属性,那就是在代码中完成的。

Java文件的代码只有一个,MainActivity:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.sample_main);



TextView textViewResource = (TextView) findViewById(R.id.text_html_resource);
textViewResource.setText(
Html.fromHtml(getResources().getString(R.string.link_text_manual)));
textViewResource.setMovementMethod(LinkMovementMethod.getInstance());


TextView textViewHtml = (TextView) findViewById(R.id.text_html_program);
textViewHtml.setText(
Html.fromHtml(
"text_html_program: Constructed from HTML programmatically."
+ " Text with a
link "
+ "created in the Java source code using HTML."));
textViewHtml.setMovementMethod(LinkMovementMethod.getInstance());

SpannableString ss = new SpannableString(
"text_spannable: Manually created spans. Click here to dial the phone.");


ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 39,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
ss.setSpan(new URLSpan("tel:4155551212"), 40 + 6, 40 + 10,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView textViewSpan = (TextView) findViewById(R.id.text_spannable);
textViewSpan.setText(ss);


textViewSpan.setMovementMethod(LinkMovementMethod.getInstance());
// END_INCLUDE(text_spannable)
}

}

其中对应于它的Java代码是这一段:

        TextView textViewResource = (TextView) findViewById(R.id.text_html_resource);
textViewResource.setText(
Html.fromHtml(getResources().getString(R.string.link_text_manual)));
textViewResource.setMovementMethod(LinkMovementMethod.getInstance());

我们先看看它引用的资源文件:

<string name="link_text_manual">text_html_resource:
Explicit links using markup.

This has markup for a
link specified
via an tag. Use a \"tel:\" URL
to
dial a phone number.]]>string>

它是通过用来标记需要添加超链接的内容,然后再用Java代码中的方法 Html.fromHtml()来给标记好的内容加上超链接。

如果你没有对它调用setMovementMethod(),那么即使添加了超链接,它也不会响应用户的输入的。

除了这个之外,我们看到它对应的字符串资源是什么鬼?” ![CDATA[]]”,“ & lt; ”, “& gt;”,恩,我查了一下

  • “ & lt; ”
  • “& gt;”

分别是XML里面预先定义好的实体,如果认真观察不难发现,它们就是<和>。

那么” ![CDATA[]]” 的意义在哪里????

标明是纯文本的,没有这个的话 <> & 字符是不能直接存入XML的,需要转义,而用这个标记则不需要转义而将这些符号存入XML文档。
可以避免未预料的特殊符号导致XML解析出错。

哦,虽然有点道理,记住就好了,就和当初 \n 代表换行是一个道理。


第四个TextView

我们先看看它的JAVA代码:

        TextView textViewHtml = (TextView) findViewById(R.id.text_html_program);
textViewHtml.setText(
Html.fromHtml(
"text_html_program: Constructed from HTML programmatically."
+ " Text with a
link "
+ "created in the Java source code using HTML."));
textViewHtml.setMovementMethod(LinkMovementMethod.getInstance());

我们看到它没有自己引用,和上面的相比,只是把引用的资源换成了自己手打的而已,那它出现在教程有什么意思呢?

对于固定的字符串资源来说,直接引用strings.xml里面定义好的资源无疑是一种更好的方法,但是一个方法只要是向我们展示如何如何给动态内容添加超链接,比如来自网络的文本。


第五个TextView

第五个画风就不一样了,它在xml布局文件里使用autoLink,也不在java代码里用Html方法,先看看它对应代码:

SpannableString ss = new SpannableString(
"text_spannable: Manually created spans. Click here to dial the phone.");
ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 39,
Spanned.SPAN_INCLUSIVE_INCLUSIVE);
ss.setSpan(new URLSpan("tel:4155551212"), 40 + 6, 40 + 10,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView textViewSpan = (TextView) findViewById(R.id.text_spannable);
textViewSpan.setText(ss);
textViewSpan.setMovementMethod(LinkMovementMethod.getInstance());

我们看到它是先构造好字符串,然后再设置给TextView。

开始他用了一个SpannableString,来构造固定的字符串,而SpannableString是什么呢?
Google API这么说:

This is the class for text whose content is immutable but to which markup objects can be attached and detached.

大概的意思是说,对于固定的文本,它可以实现在文本上加效果地功能。

我们看到它不仅加了加粗,还加了URL,这样就构造好了,然后和之前一样设置给TextView就可以了。关于更加详细地用法,由于不是重点,我也没有看,不过SpannableString这个可以改变字体的颜色大小粗细等很多很多属性,如果感兴趣可以搜一下,关于它的内容很多。


好了,关于如何给TextView添加超链接的就介绍到这里了。


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
author-avatar
粉红色头发丫头_960
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有