`
eidolon
  • 浏览: 40648 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

给 TextView 加上效果和事件响应

阅读更多

昨晚研读 ApiDemo 源码至 com.example.android.apis.text.Link 类。首先,看一下其运行效果:

 

 

要给 TextView 加上效果,方式主要有几种:

  • 第一种,自动应用效果,使用 android:autolink 属性,如:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:autoLink="all"
            android:text="@string/link_text_auto"
            />
  •  第二种,在文本中使用 <a> 标签,如:
<string name="link_text_manual"><b>text2:</b> This is some other
      text, with a <a href="http://www.google.com">link</a> specified
      via an &lt;a&gt; tag.  Use a \"tel:\" URL
      to <a href="tel:4155551212">dial a phone number</a>
</string>
  •  第三种,和第二种其实是一样的,只不过将文本改在 JAVA 代码中,如:
TextView t3 = (TextView) findViewById(R.id.text3);
t3.setText(
    Html.fromHtml(
         "<b>text3:</b>  Text with a " +
         "<a href=\"http://www.google.com\">link</a> " +
         "created in the Java source code using HTML."));
t3.setMovementMethod(LinkMovementMethod.getInstance());
  •  第四种,前面三种可以说都是自动的,而第四种就是纯“手工”的了。通过创建 SpanableString 字符串,并在之上创 建一个或多个 Span 来实现丰富的效果。例子如下:
SpannableString ss = new SpannableString("text4: Click here to dial the phone.");
ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ss.setSpan(new URLSpan("tel:4155551212"), 13, 17,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView t4 = (TextView) findViewById(R.id.text4);
t4.setText(ss);
t4.setMovementMethod(LinkMovementMethod.getInstance());

 

 

 完整的代码见 ApiDemo 吧,下面我提几点需要注意的:

  • setMovementMethod,此方法在需要响应用户事件时使用,如点击一个电话号码就跳转到拨号页面。如果不执行这个方法是不会响应事件的,即便文本看着已经是下划线蓝色字了。
  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这是在 setSpan 时需要指定的 flag,它的意义我试了很久也没试出来,睡个觉,今天早上才突然有点想法,试之,果然。它是用来标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)。看个截图就更明白了:
对比一下

 
 
  • 大小: 23 KB
  • 大小: 4.2 KB
  • 大小: 5.4 KB
1
2
分享到:
评论
1 楼 gangbener 2011-08-13  
您好,能否请教您个问题?能否有方法去掉SpannableString里面超链接的下划线呢?谢谢您~~。

相关推荐

    支持给UITextField加上target action效果

    我们知道UITextField属于UIControl的,该效果就是解决了这个问题,支持给UITextField加上target action效果,主要采用了addTarget 方法实现的,而UITextView不是UIControl,所以没有 addTarget 方法,所以要响应输入...

    GridView千变万化

    为了响应用户点击或者长按事件,我们需要为GridView添加`.setOnItemClickListener()`或`.setOnItemLongClickListener()`。在监听器中,我们可以获取点击或长按的Item的位置,进而执行相应的业务逻辑。 5. **自定义...

    Android漂亮的Listview完整版本

    4. **测试和优化**:在不同的设备和Android版本上测试ListView的展示效果和性能,根据反馈进行优化。 ### ListView的定制和功能实现 文件内容中的代码示例显示了ListView的布局是如何通过XML文件来定义的。我们可以...

    公共的titleBar

    3. **自定义TitleBar**:正如描述中所述,开发者可以创建自己的XML布局,包含TextView(展示标题)、ImageView(展示图标)和其他按钮等,然后在需要的地方通过Java代码或者Kotlin DSL进行注入和设置。这种方式的...

    android 自定义listview实现仿微信/QQ设置界面demo

    在Android应用开发中,自定义ListView是常见的需求,特别是在创建具有独特交互和视觉效果的界面时,如微信或QQ的设置界面。这个“android自定义listview实现仿微信/QQ设置界面demo”就是一个实例,旨在教你如何打造...

    Chronometer 秒表 运用

    - 倒计时应用:通过设置Chronometer的起始时间为当前时间加上目标秒数,然后启动,达到倒计时效果。 - 运动计时:在运动应用中,启动Chronometer记录运动过程中的时间,提供实时反馈。 7. **注意事项** - 由于...

    自定义View

    3. **触摸事件处理**:若需响应触摸事件,需重写`onTouchEvent()`,并正确处理MotionEvent。 4. **性能优化**:避免在`onDraw()`中执行耗时操作,使用`View.postInvalidate()`或`View.invalidate()`异步刷新,减少...

    Android应用中通过Layout_weight属性用ListView实现表格

    这部分空间将被第二个和第三个`TextView`均分,所以它们的最终宽度是10dip(内容宽度)加上225dip(由`layout_weight`分配的空间),即235dip。 现在,我们将`Layout_weight`应用于`ListView`来实现表格效果。在...

    Android开发建议

    - 示例: `tv_main_title` (TextView) **5. Activity中的View命名** - 采用逻辑名称加上视图缩写的格式。 - 示例: `titleTv` - 复杂布局建议按模块划分,使用`ViewHolder`模式。 **6. Strings.xml ID命名** - ...

    android编程实现局部界面动态切换的方法

    `one.xml` 显示文本 "this is linearLayout one",而 `two.xml` 显示文本 "this is linearLayout two" 加上一个按钮。 2. **代码实现**: 在Android的Activity中,我们需要监听按钮的点击事件,并根据用户的选择...

Global site tag (gtag.js) - Google Analytics