`
gjhappyyy
  • 浏览: 259543 次
  • 性别: 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图片替换

    在Android开发中,`ImageSpan` 是一个非常实用的组件,它允许我们在`EditText`或者`TextView`中插入图片,让文本与图像相结合,提升用户体验。这个“imageSpan图片替换”话题主要涉及到如何动态地在文本中插入从...

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

    【作品名称】:基于原生EditText+span实现的Android富文本编辑器 【适用人群】:适用于希望学习不同技术领域的小白... 编辑器内部复制粘贴ImageSpan(任意以ImageSpan方式插入的的类型,如图片、视频、自定义view等)

    edittext输入图片和文字

    ImageSpan imageSpan = new ImageSpan(bitmap, ImageSpan.ALIGN_BOTTOM); SpannableStringBuilder builder = new SpannableStringBuilder(); builder.append("文本内容 "); builder.setSpan(imageSpan, builder....

    TextView EditText 插入图片 工具类 包装

    ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM); SpannableString spannableString = new SpannableString("Text with Image "); spannableString.setSpan(imageSpan, "Text with ".length...

    Android 中EditText 添加图片(格式化文字)

    总的来说,要在Android的EditText中添加图片并实现类似微信的表情输入功能,需要对Spanned和Spannable接口有深入理解,以及熟练运用ImageSpan。通过这种方式,我们可以使应用的文字输入更加生动有趣,提升用户交互...

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

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

    Android EditText 插入表情

    在这个例子中,我们首先获取了一个ImageView的Drawable对象,然后创建了一个ImageSpan对象,最后将这个ImageSpan插入到一个SpannableString中,并设置到EditText中。 在实际项目中,你可能需要根据需求进行更复杂的...

    edittext图文混合

    可以通过setSpan()方法,传入ImageSpan对象、起始位置和结束位置以及SPAN_INCLUSIVE_INCLUSIVE标志来实现。 4. **处理点击事件**:为了使图片可以被点击并执行相应操作(如放大查看),你可以使用GestureDetector...

    EditText中插入图片并解决图片OOM

    3. **使用ImageView+SpannableString**:将图片转换为Drawable,然后通过SpannableString和ImageSpan将图片插入到EditText中。这种方式可以在显示时按需加载,而非一次性加载所有图片。 4. **利用内存缓存**:使用...

    Edittext显示表情

    创建ImageSpan后,将其设置到SpannableString的指定位置,然后将这个SpannableString设置给Edittext的setText()方法。 5. **布局适配**:由于表情图片会占据比文字更大的空间,所以需要调整Edittext的布局参数,...

    EditText插入图片

    首先,要实现`EditText`插入图片,通常我们会借助`SpannableString`和`ImageSpan`。`SpannableString`是可扩展的字符串,允许我们在字符串的不同部分应用不同的样式或行为。`ImageSpan`则是用于表示字符串中的图像,...

    Android EditText插入QQ表情源码.rar

    通过自定义`EditText`或使用`SpannableString`和`ImageSpan`,我们可以为用户提供一个类似QQ聊天应用的富文本输入体验,增强社交类应用的互动性。这个源码可以帮助开发者理解如何在实际项目中处理文本与图像的结合,...

    自定义EditText

    ImageSpan imageSpan = new ImageSpan(bitmap, DynamicDrawableSpan.ALIGN_BOTTOM); ``` 3. **设置图片位置**:接下来,确定要在文本中的哪个位置插入图片。例如,你可能希望在特定字符后插入图片。 ```java int ...

    安卓EditText输入框相关-一个基于Android原生的EditText的富文本组件支持文字输入可以插入图片.rar

    5. 在EditText的文本中定位插入位置,并添加ImageSpan对象来显示图片。 6. 更新EditText的显示,确保图片正确显示并适应文本的缩放和滚动。 此外,为了提供良好的用户体验,还需要考虑以下几点: - 图片大小的限制...

    EditText显示表情,图文混排

    2. **使用`SpannableString`和`ImageSpan`**:`SpannableString`允许我们在字符串中设置特定区域的样式,例如颜色、字体大小等。`ImageSpan`则可以将图片与文本结合,让图片在文本流中显示。我们可以通过解析表情...

    android edittext 添加表情

    ImageSpan imageSpan = new ImageSpan(context, resourceId, DynamicDrawableSpan.ALIGN_BASELINE); spannable.setSpan(imageSpan, 1, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spannable; } ``` 通过以上...

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

    在Android开发中,EditText是用于用户输入文本的控件,而有时我们可能希望在EditText中不仅输入文字,还能插入各种表情图片,以增加交互性和趣味性。本篇将深入探讨如何实现在EditText中插入表情图片,主要涉及`...

    android如何在textview或edittext上添加表情

    `SpannableStringBuilder`允许我们在字符串中插入不同类型的`Span`,包括`ImageSpan`。 - 对于TextView,直接设置`text`为`SpannableStringBuilder`实例。对于EditText,可以在`TextWatcher`中处理输入,实时构建并...

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

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

    Android图文混排发帖

    本文将深入探讨如何实现这一功能,主要涉及`ImageSpan`、`Spannable`以及`editText`等关键组件和技术。 首先,我们要明白图文混排的基本概念。在Android中,它指的是在一个文本流中插入图片,使得文字和图片可以...

Global site tag (gtag.js) - Google Analytics