Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 581|回复: 0

[实例教程][Android实例] 一个TextView中显示不同颜色的文字+

[复制链接]

该用户从未签到

发表于 2011-10-22 12:26:19 | 显示全部楼层 |阅读模式
当初遇到这个问题时我想的很复杂,后来发现Android中已经提供了相应的解决办法。这些都是在实际开发中遇到的问题,希望大家共同学习,共同进步啊!
当初是要做游戏的聊天系统,要想QQ等其他软件一样能在输入框中输入不同颜色的文字中间还要有图片
就如下图


其实这一切都用到了HTML这个类,这要学过Html的都能得到自己想要的想过,主要是在实现过程中要注意下。
例如上图左边是一个TextView,右边是一个EditText,我们并不需要在布局文件中做什么特别的设置,所有的效果都是在程序中实现的。实现上图的效果的代码如下:
String ht = "www.baidu.com"
+ "<img src='" + R.drawable.icon + "' />"
+ "<font color='green'>sdsa</font>"
+ "<a href='baidu'>BaiDu</a>kjdjfakjkjeifaknk";
TextView    test = (TextView) findViewById(R.id.txt);
EditText   ed = (EditText) findViewById(R.id.edt);
ed.setText(Html.fromHtml(ht, getImageGetterInstance(), null),   BufferType.SPANNABLE);  
test.setText(Html.fromHtml(ht, getImageGetterInstance(), null));

这就是实现上图效果的主要代码。其中有几个问题要注意啊,可能有的人已经注意到了上面的代码中实现各种文字和图片的效果都是用的Html语言,所以要想实现这种效果就要会一点网页方面的知识(一点点,不会很难的!)。
再添加图片时,可以是项目drawable中的图片,也可以是assets中的图片,只不过我们要为Html.fromHtm()提供不同的ImageGetter对象罢了,即一上程序中getImageGetterInstance()的返回值,
若你想用图片的ID取用图片,那么可以用一下这个
public ImageGetter getImageGetterInstance() {
  ImageGetter imgGetter = new Html.ImageGetter() {
   @Override
   public Drawable getDrawable(String source) {
    int id = Integer.parseInt(source);
    Drawable d = getResources().getDrawable(id);
    int height = fontH;
    int width = (int) ((float) d.getIntrinsicWidth() / (float) d
      .getIntrinsicHeight()) * fontH;
    d.setBounds(0, 0, width, height);
    return d;
   }
  };
  return imgGetter;
}    //其中fontH是字体高度,我只想让图片和字体等高,这样看起来舒服点

若果你想用其他位置的图片(无法使用ID)可以用下面的方法:
public ImageGetter getImageGetterInstance() {
  ImageGetter imgGetter = new Html.ImageGetter()
{
  public Drawable getDrawable(String url)
  {
try
  {
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream(url));
  }
  catch (Exception e)
  {
   e.printStackTrace();
   Bitmap bitmap = null;
  }   
   Drawable d = new BitmapDrawable(bitmap);
   d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
   return d;
  }
};
return imgGetter;
}

当然,如果要使用assets中的图片时,在Html语句中就应该是文件的路径和名称了,例如
String ht="<img src='f/f0.png' />";

其实,Html类中提供了两个fromHtml()方法,其中一个只有一个参数:Html.fromHtml(String s),如果你不想添加图片就可以使用这个方法。
大家或许还注意到了我再给EditText中添加文字时用的是setText(Html.fromHtml(ht, getImageGetterInstance(), null),   BufferType.SPANNABLE);  这个方法,为什么不直接用setText()方法呢?
我们在使用EditText时,大多都是想从中取出输入值,但是一旦我们采用了以上的方法在文字中添加不同颜色的字体和图片后,你从EditText中取出的就不是你看到的和开始写入的了,你会看到图片位置是一个没有见过的符号,而有颜色的字体也没有了颜色的标记。我使用这个setText方法就是为了让我们输入什么就取出出什么!
这个setText方法就是现指定输入的数据类型,将来取出时才可将其转化为什么类型(java中的向上向下转型的问题)。有心的人会发现其实Html.fromHtml()方法的返回值其实并不是String,而是Spanned
我们输入(写入)的是Html语言,所以我们还要取出我们输入的Html语言方法如下
String html = Html.toHtml((Spannable) ed.getText());
这样我们就能得到原来的那一串文字了,不过在这床文字的前后分别被添加上了"<p>","</p>",不过这对我们来说应该就不是问题了吧!哈哈
一点小心得,献丑了,有问题请留言,我们一起学习一起进步!
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 12:26:27 | 显示全部楼层

Re:[实例教程][Android实例]

呵呵!貌似可以哦!MARK !
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-6-3 15:13 , Processed in 0.348263 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表