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. poj 3046 Ant Counting

    Ant Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4982   Accepted: 1896 Desc ...

  2. urllib2.urlopen超时

    urllib2.urlopen设置超时,可以解决read方法阻塞的问题 urllib2.urlopen(‘xxx’,timeout=30)

  3. bzoj 3626 LCA

    这一道题咋一看只觉得是离线,可以求出所有的f(1,i,z), 答案就等于f(1,r,z)-f(1,l-1,z).但是没有具体的做法,但是求LCA的深度和有一个非常巧妙的做法,每加一个点,就把这个点到根 ...

  4. how to Enable Client Integration

    i got a problem,the problem is list cant use export to excel button in sharepoint 2010. I found my a ...

  5. 3.IP转发

    1. "vim  /usr/lib/sysctl.d/00-system.conf"在#Disable netfilter on bridges.栏下面添加行:"net. ...

  6. mysql的时间函数

    from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是Unix 时间戳),可以是字段名,也可以直接是Unix 时间戳字符串 后面的 '%Y%m%d' 主要是将返回值 ...

  7. [OC] UITabBarController

    1. New CocoaTouch class -> Select Objective C -> named RootViewController 2. Disable APC error ...

  8. 拥抱ARM妹子 序章!ARM妹子~~ 哥我来啦!

    一个负心汉即将移情别恋,从51转到ARM妹子啦?其实8是的,俺准备开后宫.哇——咔~咔~~.考虑功耗和成本等问题,只有51肯定是不够的,所以嘛~~(一脸坏笑)嘿嘿~~,ARM妹子俺追定了.出于对ARM ...

  9. Foreign Exchange

     10763 Foreign ExchangeYour non-profit organization (iCORE - international Confederation of Revolver ...

  10. XSS前端防火墙

    前一段时间,在EtherDream大神的博客里看到关于XSS防火墙的一系列文章,觉得很有意思.刚好科创要做一个防火墙,就把XSS前端防火墙作为一个创新点,着手去实现了. 在实现过程中,由于各种原因,比 ...