`
gjhappyyy
  • 浏览: 256267 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

EditText和ImageSpan

 
阅读更多

 EditText和TextView一样,也可以进行图文混排。所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示,也可混合输入文字和图像,让我们先回顾一下图5.2所示的QQ聊天输入框,在输入框中可以同时输入文字和表情图像。实际上,这种效果在Android SDK中只需要几行代码就可以实现。为了使读者更有学习的冲动,先来欣赏一下即将实现的效果,如图所示。

Android开发技巧:像QQ一样输入表情图像 - 心海飘云 - zctyas blog

 


  为了实现这个程序,首先来准备一些要用到的素材,也就是要在EditText控件中输入的图像文件。本例准备了9个png图像文件(face1.png至face9.png),都放在了res\drawable目录中。
接下来在屏幕上放一个只能显示3行(可输入多行)的EditText和一个Button,布局文件的代码如下:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/edittext" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:lines="3" android:gravity="left|top"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="随机插入表情"
android:onClick="onClick_RandomFace" android:layout_marginTop="10dp" />
</LinearLayout>


上面代码的<EditText>标签中将android:gravity属性值设为left|top。以使输入的文本从左上角开始显示,如果不设置该属性,则输入的文本会从左侧中心位置开始显示(由于设置了android:line=”3”,因此,EditText可同时显示三行的内容,所以会存在这个问题,如果只显示一行,则不存在这个问题)。

     <Button>标签的android:onClick属性值指定了单击事件方法(onClick_RandomFace),在该方法中随机获得了face1.png至face9.png中任意一个图像资源的ID。最常用的方法是将这9个图像资源ID放到数组中,然后随机产生一个数组索引来获取相应的图像资源ID。但本例未采用这种方法,而是采用了直接通过反射技术从R.drawable类中获得图像资源ID的方法。这种方法的好处是一但图像资源非常多时,可以不需要在数组中挨个定义就可以获得任意的图像资源ID。

     在5.2.2节使用了<img>标签来插入图像,虽然在EditText控件中插入图像也可采用这种方法。但本例使用了另外一种更简单的方法,就是使用android.text.style.ImageSpan类来直接插入图像。下面来看看具体的实现代码。

 public void onClick_RandomFace(View view)
{
// 随机产生1至9的整数
int randomId = 1 + new Random().nextInt(9);
try{
// 根据随机产生的1至9的整数从R.drawable类中获得相应资源ID(静态变量)的Field对象
Field field = R.drawable.class.getDeclaredField("face" + randomId);
// 获得资源ID的值,也就是静态变量的值
int resourceId = Integer.parseInt(field.get(null).toString());
// 根据资源ID获得资源图像的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
// 根据Bitmap对象创建ImageSpan对象
ImageSpan imageSpan = new ImageSpan(this, bitmap);
// 创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像
SpannableString spannableString = new SpannableString("face");
// 用ImageSpan对象替换face
spannableString.setSpan(imageSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 将随机获得的图像追加到EditText控件的最后
edittext.append(spannableString);
}catch(Exception e){}
}

   

编写上面代码需要注意如下几点。
1.  由于R.drawable中的资源ID都是public的静态变量,因此,可直接使用Field.get方法获得这些变量的值。如果是private或protected的变量,需要field.setAccessible(true)设置变量值的访问权限才可以读写这些变量。
2.  使用Field.get方法获得变量值时,如果是静态变量。Field.get方法的参数值设为null即可。如果不是静态变量,需要为Field.get方法指定一个变量所在类的对象作为参数值。
3.  由于EditText类不能直接插入Span对象,因此,需要先使用SpannableString对象来封装Span对象(如本例中的ImageSpan对象),再将SpannableString对象插入到EditText控件中。

 

【转】http://zctya.blog.163.com/blog/static/1209178201199113713925/

【转】http://blog.csdn.net/comeonsbt/article/details/7756495

I've been trying to solve the same problem today and find the solution. To make the image clickable you need to attach a ClickableSpan object to the same range as ImageSpan for your image. When you get your Spanned object from Html.fromHtml() you can go through the set of ImageSpan objects assigned for it and attach additional ClickableSpan object.

Like this:

            ImageSpan[] image_spans = s.getSpans(0, s.length(),ImageSpan.class); 
 
            for(ImageSpan span : image_spans){ 
 
                finalString image_src = span.getSource(); 
                finalint start = s.getSpanStart(span); 
                finalintend= s.getSpanEnd(span); 
 
                ClickableSpan click_span =newClickableSpan(){ 
 
                    @Override 
                    publicvoid onClick(View widget){ 
 
                        Toast.makeText(HtmlImagesTestActivity.this, 
                                "Image Clicked "+ image_src, 
                                Toast.LENGTH_SHORT).show(); 
 
                    } 
 
                }; 
 
                ClickableSpan[] click_spans = s.getSpans(start,end,ClickableSpan.class); 
 
                if(click_spans.length !=0){ 
 
                    // remove all click spans 
 
                    for(ClickableSpan c_span : click_spans){ 
                        s.removeSpan(c_span); 
                    } 
 
 
                } 
 
 
                s.setSpan(click_span, start,end,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
 
            }             
分享到:
评论
1 楼 binzhao88 2013-12-30  
       

相关推荐

    imageSpan图片替换

    在Edittext中替换从数据库中取出的图片,用split进行文字分割。

    RichEditor:基于原生EditText + span实现的Android富文本编辑器

    斜体,删除线,下划线行内样式支持插入标题,引用段内样式支持插入初步图片,视频支持插入初步自定义布局支持视频,gif和长图标记支持图片圆角支持图片视频及自定义查看的点击事件 撤销重做支持行内ImageSpan,...

    利用SpannableString和ImageSpan在textview中插入图片的方法

    在这里我们采用SpannableString和ImageSpan两个类来实现这一功能。 先上效果图: main.xml布局文件。我们使用自己定义的EditText &lt;?xml version=1.0 encoding=utf-8?&gt; &lt;LinearLayout xmlns:android=...

    使用Html在EditText中任意位置插入图片并正确显示

    借助SpannableString、ImageSpan、ImageGetter和html标签实现在EditText中任意位置插入图片,并准确显示,两个java文件对应两个界面,一个编辑EditText内容,点击“图片”按钮可在任意位置插入图片,点击“显示”...

    Android EditText实现输入表情

    editText是TextView的子类,TextView能用的工具EditText都能用,这里就是editText利用SpannableString的ImageSpan实现输入表情的功能 类结构图: 二、方法 1)EditText利用SpannableString的ImageSpan实现添加表情...

    在EditText中插入表情图片 (CharacterStyle&SpannableString)

    NULL 博文链接:https://gundumw100.iteye.com/blog/904107

    Android实现可以图文混合和长截图的日记本App,优秀安卓课程设计!

    本程序的亮点: 1.更换了字体叹墨咏黑 2.这个记事本程序支持图文混排 3.可以从相机、图库调取图片 ...7.利用SpannableString、ImageSpan和editable三个类加上对光标的操作实现在EditText的插入图片

    Android编写简单的聊天室应用

    所以我们可以利用正则表达式找出图片id包装成ImageSpan然后把ImageSpan放到SpannableString中,最后把SpannableString放入edittext中,下面是源码: package com.coreandroid.util; import java.lang.re

    Android用StaticLayout实现文字转化为图片效果(类似长微博发送)

    前言 StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理,下面是如何使用StaticLayout的...private EditText textView; private ImageView imageView; private Button btn; pr

    SpEditTool

    用Fresco加载gif 更多样式的ImageSpan变更记录1.0.1-1.0.4 修正错误1.0.0 使用更优雅的@mention实现(特别感谢 ) 更清晰的包装结构支持Glide / AndroidGifDrawable的库用法Gradle根build.gradleallprojects {...

    Android代码-SpEditTool

    Description ...[ ] more styles of ImageSpan change log 1.0.0 use more elegant implementation of @mention(special thanks to iYaoy) clearer package structure library for supportin

    Android图文混排发帖

    今日需要实现一个发帖功能,找了些APP进行参考,最终选择知乎图文混排的形式发帖,用户体验感更好。 看了知乎源码才知道,知乎的发帖是用webview实现的,我们需要原生开发,得自己写一个。

Global site tag (gtag.js) - Google Analytics