Android EditText中插入图片并响应点击事件
EditText中插入图片基本就是两种方法:
1,通过Html.fromHtml(..)来实现[mw_shl_code=java,true]eText.append(Html.fromHtml("<img src='" + R.drawable.ohoh + "'/>",imageGetter, null));[/mw_shl_code] 2,通过ImageSpan与SpannableString/SpannableStringBuilder. [mw_shl_code=java,true]SpannableString ss = new SpannableString(imgStr);Drawable drawable = getResources().getDrawable(R.drawable.bad_smelly);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());ImageSpan imageSpan = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);ss.setSpan(imageSpan, 0, 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;@Overridepublic 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;}@Overrideprotected 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() {@Overridepublic Drawable getDrawable(String source) {int id = Integer.parseInt(source);// 根据id从资源文件中获取图片对象Drawable d = getResources().getDrawable(id);d.setBounds(0, 0, 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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubSpannableString ss = new SpannableString(imgStr);Drawable drawable = getResources().getDrawable(R.drawable.hungry_1);drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());ImageSpan imageSpan = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);ss.setSpan(imageSpan, 0, 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(0, 0, drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());ImageSpan imageSpan = new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);ss.setSpan(imageSpan, 0, imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);eText.append(ss);setSpanClickable();eText.append("\n");}});button3.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {eText.append(Html.fromHtml("<img src='" + R.drawable.ohoh + "'/>",imageGetter, null));setSpanClickable();}});}private OnClickListener textListener = new OnClickListener() {//此方法不靠谱 @Overridepublic void onClick(View v) {// 关闭软键盘InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(eText.getWindowToken(), 0);Spanned s = eText.getText();ImageSpan[] imageSpans = s.getSpans(0, 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, 0);}};public void setSpanClickable() {//此方法比较靠谱Spanned s = eText.getText();//setMovementMethod很重要,不然ClickableSpan无法获取点击事件。 eText.setMovementMethod(LinkMovementMethod.getInstance());ImageSpan[] imageSpans = s.getSpans(0, 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() {@Overridepublic 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 != 0) {// remove all click spansfor (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不可编辑可能有人会想到用setEnable方法,但是设置了setEnable(false)之后,EditText的点击事件就不可以响应了. 如果我们想让EditText不可编辑又能 ...
- android 部分区域点击,Android编程实现ListView中item部分区域添加点击事件功能
本文实例讲述了Android编程实现ListView中item部分区域添加点击事件功能.分享给大家供大家参考,具体如下: 需求如题目:Android listview中item部分区域添加点击事件,在 ...
- Android:TextView与EditText中插入表情图片
表情工具类,用于在TextView与EditText中插入表情图片: public class FaceUtil {public int[] faceIds;public String[] faceC ...
- R语言ggplot2可视化在可视化的接种中插入图片、添加图片实战
R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战 目录 R语言ggplot2可视化在可视化的接种中插入图片.添加图片实战
- PHP下使用FPDF在PDF中插入图片
Cell函数,该函数主要用于向PDF 文档中插入文本. 通常,PDF 文档是由文本和图片共同组成的. FPDF 中使用Image函数向PDF中插入图片,其语法格式如下所示: Image(string ...
- 图片适应窗口_在word中插入图片,如何避免失真模糊?实用文档建议收藏
插入图片 在WORD文档中插入图片是一个相当常用的操作. 一般通常的做法,是使用工具截图或在其他工具中复制的图片类内容,然后在WORD文档中粘贴出来. 还有一种做法,是使用功能区"插入&qu ...
- 打开另外一个页面_如何在PDF页面中插入图片?
如何给PDF添加图片?有些时候为了丰富PDF的文档内容,需要添加一些图片,相比Word或PPT文档可以直接插入图片,而PDF的操作很多人可能并不熟悉,下面一起来看看如何在PDF文档中插入图片. 关于P ...
- PDF编辑器哪个好,如何在PDF中插入图片背景
由于PDF文档不像Word那么容易编辑,并且具有较强的保密性,所以PDF文档的编辑需要借助其他第三方的PDF编辑器才能对PDF文件进行编辑,下面,我就教大家如何利用PDF编辑器在PDF中插入图片背景, ...
- 使用SQL向SQL Server2005中插入图片
今天找到了用SQL向SQL Server2005中插入图片的方法,特此记录一下,免得自己忘记. update dbo.BIZ_RPTTL_PTN_M set RPTTL_M_RPT_IMG = (SE ...
最新文章
- linux mysql统计次数_MySQL统计函数记录
- git工作区、暂存区和仓库区
- 在为时已晚前 阻止物联网安全威胁和攻击
- oracle 48小时内_恭喜詹姆斯!恭喜湖人!戴维斯续约最新动态:48小时内或达成...
- RedHat系统常用的日志文件详解三
- java match parent_Maven的聚合(多模块)和Parent继承
- esp32-智能语音-录音(保存于SD卡)
- 图像目标检测(Object Detection)原理与实现(三)
- 进入全屏 nodejs+express+mysql实现restful风格的增删改查示例
- 【指纹识别】基于matlab GUI指纹识别【含Matlab源码 029期】
- 论文_毕业设计复现机器学习模型案例大本营(收藏)
- Kaggle_Predict Future Sales_Prac 1(时间序列预测商品销量)
- 分享,请不要忽视了作者的版权
- 哈工大计算机系统2022春 大作业 程序人生
- 精心整理了50个数据源网站(建议收藏)
- 2021年危险化学品经营单位安全管理人员考试及危险化学品经营单位安全管理人员试题及解析
- exls表格搜索快捷键_excel表格中的快捷键
- ATTCK框架以及使用场景
- HDU5128 The E-pang Palace
- 电话号码对应英文单词 (python)