Android EditText中插入图片并响应点击事件
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中插入图片并响应点击事件的更多相关文章
- Android EditText中插入话题模块的删除处理方法
在 EditText 中添加话题 或者是 @某人 时 看起来挺简单,实际操作会有很多坑爹的问题 private String mTopic: //光标保持在话题的末尾 mInputEdit.setOn ...
- Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件
转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件 ...
- TextView中的部分文字响应点击事件
TextView是android常用的控件,经常要显示不同文字的大小,颜色,......今天要实现这样这样一个需求,TextView某段内容显示的文字颜色不一样,并且点击区域只能是改变了颜色的字. 1 ...
- UITableViewCell内放置复杂结构的subview,但subview中的Button不响应点击事件
原因可能是subview的frame没设置或者不对,这种情况下subview的内容依然正常显示,但是无法接收点击响应的消息. 具体来说就是缺少了下面这句代码: // subview - (id)ini ...
- Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4. ...
- java POI实现向Excel中插入图片
做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...
- 在Altium_Designer_PCB_中插入图片的方法
详细请看PDF: http://files.cnblogs.com/files/BinB-W/在Altium_Designer_PCB_中插入图片的方法.pdf 配套文件: http://files. ...
- 在LaTeX文档中插入图片的几种常用的方法
LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...
- 在RichTextBox控件中插入图片
. 在RichTextBox控件中插入图片 关键点 . 实现过程 . public void ShowInsertImageDlg() { OpenFileDialog OpenFileD ...
随机推荐
- Ubuntu、Sql Server卸载心得
这几天真是搞得亏大了! 首先是卸载Ubuntu,直接在Windows下格式化那个盘了,这就出岔子了……然后越来越糟糕,最后弄得一个系统都没有了……然后重装系统…… 然后装VS和Sql Server,因 ...
- Centos下如何修改Mysql的root密码
1.用帐号登录mysql mysql –u root 或#mysql –uroot –p 2.改变用户数据库 命令:mysql>use mysql mysql> use mysqlRead ...
- Angularjs在线编辑器
1.TextAngular: https://github.com/fraywing/textAngular textAngular是一个强大的Text-Editor/Wysiwyg 编辑器,用于An ...
- ES6学习笔记(二)
1.数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...
- 服务器迁移之debian重新配置Web服务的细节
之前配置Linux服务器时采用的是Debian系统一直很稳定,这次准备迁移到新的服务器环境上,好在以前的配置我在博客都做了备忘,所以很容易就搞定了,这次服务系统采用的是最新的Debian 7.0,但是 ...
- linux下rm误删除数据库文件的恢复方法
在linux redhat 5.4版本,rm误删除数据库文件的恢复过程分享.测试没有问题,可用. 1.首先测试rm 误删除数据库文件 [oracle@primary dbwdn]$ ll total ...
- 给虚拟机中的CentOS7配置固定ip
在虚拟机中安装完了CentOS7之后,使用了DHCP来获取ip,vmware的网络连接使用了NAT模式.但是在把Linux设置为固定ip地址后,虚拟机里的linux可以ping通全网段的ip地址,但是 ...
- WPF后台更换背景图-Background
Uri uri = new Uri("Images/BACK.gif", UriKind.Relative);BitmapImage bimg = new BitmapImage( ...
- 深层次详解Exception
所有的异常类都继承自System.Exception类,当异常产生时,CLR将创建该异常类的实例对象,将从最底层依次寻找合适的异常类型,同时若存在catch语句时将会选择最合适的语句进行处理. cat ...
- EXTJS 4.2 资料 控件之Grid 行编辑绑定下拉框,并点一次触发一次事件
主要代码: { header: '属性值', dataIndex: 'PropertyValueName', width: 130, editor: new Ext.form.field.ComboB ...