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;

        @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(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() {

                        @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(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() {
                        @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(), 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() {
                                @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 != 0) {
                                // 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);
                }
        }

}

效果:

代码:这里

时间: 2024-08-05 00:53:50

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

button不在父试图中,但是需要响应点击事件

当button不在父试图的范围内时,是无法响应点击事件的.项目中涉及了这个部分,之后写了个小demo(点击按钮,向上弹出两个button,并且都能响应点击事件),如下: 自定义view:CUMoreView ////  CUMoreView.h// #import <UIKit/UIKit.h> typedef void(^btnClickBlock)(UIButton *btn); @interface CUMoreView : UIView @property (nonatomic, co

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

转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件做特别处理. 一.先上图片文件transparent.png,图片中间区域与外围区域是非透明的,其它区域是透明的: 二.上布局文件test.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout

自定义cell中的button不响应点击事件

用xib自定义了一个cell(xib中拖动的直接是UIView,UIView中添加了Button),在xcode6.4的时候运行没问题,但是在xcode7发现按钮不能点击了.在Xcode7运行的时候,响应的是cell的didSelectedRow方法.解决方法,把xib自定义的cell中用的UIView改为UITableViewCell,把UIButton添加到cell的contentView里边就没有问题了.如果自定义的cell东西太多,可以有一个简单的方法,是把cell的contentVie

android textview 中部分内容 颜色 样式 点击事件的设置

// 文本内容 SpannableString ss = new SpannableString(remindtitle); int stringlength = ss.length(); // 设置0-2的字符颜色 ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置2-5的字符链接到电话簿,点击时触发拨号 ss.setSpan(new URLSpan("tel

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

向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4.4系统中插入的缩略图和原图在sdcard根目录下的DCIM文件夹这种,Android5.0以上的机型插入的缩略图在sdcard根目录下的Pictures文件夹下,原图存放在DCIM文件夹下. 导致这个问题的原因查看代码后知道在插入原图的同时系统自动生成了一个缩略图并保存再相应的文件目录下,代码如下.

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

SharePoint 在文本编辑框中插入图片报错

SharePoint 在文本框中插入图片如果报错“Upload Image: An unexpected error has occurred.”, 很有可能是网站自带的“SiteAssets”文档库没有编辑权限.因为我们在文本框中插入图片的时候,默认的图片的存储在“SiteAssets”文档库中.

Android工程中加入图片,报错cannot be resolved or is not a field

SDK和ADT为22.6.2版本 工程为4.4.2 今天在写Android代码的时候,往工程中加入了几张图片,然后在代码中使用R.drawable调用时,一直报错 cannot be resolved or is not a field 然后我查看了gen目录下的R.java文件,发现里面已经有我加入的图片资源ID了,觉得很奇怪,一般是无法生成R.java文件的时候才会出现这种现象啊 在网上查了资料也未见有可以解决我这个问题的方法,然后我就把我的代码从头到尾重新看了一遍,开始也没有发现什么异常,

java POI实现向Excel中插入图片

java POI实现向Excel中插入图片 标签: javapoiexcel 2014-03-05 08:59 9103人阅读 评论(4) 收藏 举报  分类: [JAVA开发]-----JavaScore(34)  版权声明:本文为博主原创文章,未经博主允许不得转载. 做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片,就是这个加入图片搞了好久.同时网络上确实