EditText中插入图片基本就是两种方法:

,通过Html.fromHtml(..)来实现
[mw_shl_code=java,true]eText.append(Html.fromHtml("<img src='" + R.drawable.ohoh + "'/>",
imageGetter, null));[/mw_shl_code]
,通过ImageSpan与SpannableString/SpannableStringBuilder.
[mw_shl_code=java,true]SpannableString ss = new SpannableString(imgStr);
Drawable drawable = getResources().getDrawable(
R.drawable.bad_smelly);
drawable.setBounds(, , drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable,
ImageSpan.ALIGN_BASELINE);
ss.setSpan(imageSpan, , imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
eText.append(ss);

下面贴上完整代码,
点击事件通过增加ClickableSpan来实现。

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Html.ImageGetter;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
private final String TAG = "MainActivity";
private EditText eText;
private int spanEnd; @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
eText = (EditText) findViewById(R.id.test1_editText1);
final String imgStr = "[smile]"; // eText.setOnClickListener(textListener); //用textListener实现ImageSpan响应点击不靠谱,有时无效。 final ImageGetter imageGetter = new ImageGetter() {
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source); // 根据id从资源文件中获取图片对象
Drawable d = getResources().getDrawable(id);
d.setBounds(, , d.getIntrinsicWidth(), d.getIntrinsicHeight());
return d;
}
}; Button button = (Button) findViewById(R.id.test1_button1);
Button button2 = (Button) findViewById(R.id.test1_button2);
Button button3 = (Button) findViewById(R.id.test1_button3); button.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
SpannableString ss = new SpannableString(imgStr);
Drawable drawable = getResources().getDrawable(
R.drawable.hungry_1);
drawable.setBounds(, , drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable,
ImageSpan.ALIGN_BASELINE);
ss.setSpan(imageSpan, , imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); int nowLocation = eText.getSelectionStart();
//需要对nowLocation进行判断以免出现越界异常。
eText.getText().insert(nowLocation, ss);
setSpanClickable();
eText.getText().insert(spanEnd , "\n");
}
}); button2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
SpannableString ss = new SpannableString(imgStr);
Drawable drawable = getResources().getDrawable(
R.drawable.bad_smelly);
drawable.setBounds(, , drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable,
ImageSpan.ALIGN_BASELINE);
ss.setSpan(imageSpan, , imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
eText.append(ss);
setSpanClickable();
eText.append("\n");
} }); button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
eText.append(Html.fromHtml("<img src='" + R.drawable.ohoh + "'/>",
imageGetter, null));
setSpanClickable();
}
}); } private OnClickListener textListener = new OnClickListener() {
//此方法不靠谱
@Override
public void onClick(View v) {
// 关闭软键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(eText.getWindowToken(), ); Spanned s = eText.getText();
ImageSpan[] imageSpans = s.getSpans(, s.length(), ImageSpan.class);
int selectionStart = eText.getSelectionStart();
for (ImageSpan span : imageSpans) {
int start = s.getSpanStart(span);
int end = s.getSpanEnd(span); if (selectionStart >= start && selectionStart < end)// 找到图片
{
Toast.makeText(getApplicationContext(), "找到图片", Toast.LENGTH_SHORT).show();
return;
}
} // 打开软键盘
imm.showSoftInput(eText, );
}
}; public void setSpanClickable() {
//此方法比较靠谱
Spanned s = eText.getText();
//setMovementMethod很重要,不然ClickableSpan无法获取点击事件。
eText.setMovementMethod(LinkMovementMethod.getInstance());
ImageSpan[] imageSpans = s.getSpans(, s.length(), ImageSpan.class); for (ImageSpan span : imageSpans) {
final String image_src = span.getSource();
final int start = s.getSpanStart(span);
final int end = s.getSpanEnd(span);
spanEnd = end; Log.i(TAG,"setSpanClickable , image_src = "+image_src+" , start = "+start+" , end = "+end); ClickableSpan click_span = new ClickableSpan() {
@Override
public void onClick(View widget) {
eText.setCursorVisible(false);
Log.i(TAG , "click_span , onClick , "+eText.getSelectionStart());
Toast.makeText(MainActivity.this,
"Image Clicked " + image_src, Toast.LENGTH_SHORT)
.show();
}
}; ClickableSpan[] click_spans = s.getSpans(start, end,
ClickableSpan.class);
Log.i(TAG,"click_spans.length = "+click_spans.length);
if (click_spans.length != ) {
// remove all click spans
for (ClickableSpan c_span : click_spans) {
((Spannable) s).removeSpan(c_span);
}
} ((Spannable) s).setSpan(click_span, start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Log.i(TAG,"length = "+s.getSpans(start, end,ClickableSpan.class).length);
}
} }

效果:

代码:这里

Android EditText中插入图片并响应点击事件的更多相关文章

  1. Android EditText中插入话题模块的删除处理方法

    在 EditText 中添加话题 或者是 @某人 时 看起来挺简单,实际操作会有很多坑爹的问题 private String mTopic: //光标保持在话题的末尾 mInputEdit.setOn ...

  2. Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件

    转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件 ...

  3. TextView中的部分文字响应点击事件

    TextView是android常用的控件,经常要显示不同文字的大小,颜色,......今天要实现这样这样一个需求,TextView某段内容显示的文字颜色不一样,并且点击区域只能是改变了颜色的字. 1 ...

  4. UITableViewCell内放置复杂结构的subview,但subview中的Button不响应点击事件

    原因可能是subview的frame没设置或者不对,这种情况下subview的内容依然正常显示,但是无法接收点击响应的消息. 具体来说就是缺少了下面这句代码: // subview - (id)ini ...

  5. Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)

    向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4. ...

  6. java POI实现向Excel中插入图片

          做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...

  7. 在Altium_Designer_PCB_中插入图片的方法

    详细请看PDF: http://files.cnblogs.com/files/BinB-W/在Altium_Designer_PCB_中插入图片的方法.pdf 配套文件: http://files. ...

  8. 在LaTeX文档中插入图片的几种常用的方法

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...

  9. 在RichTextBox控件中插入图片

    . 在RichTextBox控件中插入图片 关键点 . 实现过程 .   public void ShowInsertImageDlg() {     OpenFileDialog OpenFileD ...

随机推荐

  1. vs2010创建COM以及调用

    1,创建COM组件 2,调用COM 3,MFC调用COM

  2. C++ 的template

    vector的标准模板是:template<template<typename X, class allocator<X> > class T>而普通模板则是tem ...

  3. 在使用masm32 rc编译资源文件.rc出现的问题

    fatal error RC1004: unexpected end of file found 很蛋疼.然来是.h宏定义文件中.最后一行加个回车键即可.否则就提示这错误.

  4. C#使用Zxing2.0生成二维码 带简单中心LOGO

    参考:http://www.open-open.com/lib/view/open1379214678162.html 代码:http://files.cnblogs.com/halo/%E4%BA% ...

  5. github项目filter_firewall说明

    本文编写的目的: 本文是对上传到github上的项目进行说明.github链接:filter_firewall有任何意见或者建议可以Email:18277973721@sina.cn 项目介绍: 包过 ...

  6. 如何用命令的方式查看你的Office2010密钥是否是永久的有效

    首先,ctrl+R ,  然后输入cmd,  回车, 进入黑框框 其次,在你的office安装位置下找到这个文件OSPP.VSB,对其右键,查看其属性,复制下它的位置.,接着  就照着下图上的操作吧~ ...

  7. ubuntu安装QQ目前最完善的方法!(亲测,成功)

    wine qq 2012 for linux Ubuntu 64位兼容(12月21日末日版) 由 smile » 2011-04-07 9:08 +-------------------------- ...

  8. How to install Hadoop

    1.How to install Hadoop 3.0.0 http://blog.sina.com.cn/s/blog_4a1f59bf01010kx3.html 2.How to install ...

  9. Eclipse中propedit插件安装(解决property中文问题)

    Eclipse Help--Install New Software... Add... propedit   -- http://propedit.sourceforge.jp/eclipse/up ...

  10. PL/SQL中如何执行DDL、SCL?

    PL/SQL程序中不能直接执行DDL语句.为什么? 假设我们在pl/sql程序中有这样的一条DDL语句—— drop table emp:在第一次解析pl/sql中的“drop table emp;” ...