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 ...
随机推荐
- root-systerm-bin是什么program
root-systerm-bin是什么program http://packages.ubuntu.com/lucid/root-system-bin
- DEDECMS中,友情链接
友情链接:dede:flink {dede:flink row='24' type='image' titlelen="24" typeid="0"} [fie ...
- zabbix3.0.3 设置邮件报警
在zabbix3.0.3 设置报警这里卡了两天.终于解决了,这里我使用的mailx来作为发送邮件的客户端 1.设置mailx发信账号 yum -y install mailx ln -s /bin/m ...
- qml自定义标题栏
要实现自定义的标题栏只需在原来的窗口的基础上创建一个Rectangle并将其定位在窗口顶部即可,实现代码如下: ApplicationWindow { id: mainWindow visible: ...
- selector的理解
对于nio这块最近几年一直就有关注,知道非阻塞,线程池,缓冲池,io的模式select,poll,epoll,甚至epoll中的et,lt. 但是最近才有时间实际看了看netty的源码,才发现原来se ...
- 转载 C# BindingSource
1.引言 BindingSource组件是数据源和控件间的一座桥,同时提供了大量的API和Event供我们使用.使用这些API我们可以将Code与各种具体类型数据源进行解耦:使用这些Event我们可以 ...
- 在Tomcat中部署Java Web应用程序
在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署 静态部署指的是我们在服务器启动之前部 ...
- YII千万级PV架构经验分享--俯瞰篇--架构即产品
hello,大家好,我是方少,今天想问大家一个问题,如果我们自己就是产品,那么我们怎样才能说服别人,我们是最优秀的呢?高学历,不错,别人成功过了.会php,java,c#,python不行再学c++, ...
- php入门单引号与双引号区别
[1]单引号和双引号在处理变量的时候做法: 括在双引号内的变量会解释出值,但是括在单引号内则不做处理,直接输出: <?php $var = 'my name is huige'; echo &q ...
- ECSHOP如何解决购物车中商品自动消失问题
最近有客户反映关于ECShop购物车的问题:需要加入多个商品到购物车时,发现之前加入到购物车的商品都自动消失了,只有最后一次加入购物车的商品在里面.那么,这是什么原因呢? 因为ECShop的SESSI ...