看到很多应用中EditText中可以插入图片,并且图片可以响应点击事件来进行相关操作。
比如很多MMS应用中可以在EditText中直接编辑彩信,于是通过搜索来看看别人到底是怎么实现的,自己也想试试。
参考贴:
http://blog.csdn.net/gyflyx/article/details/6591388
http://blog.csdn.net/fengkuanghun/article/details/6292383
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=49342
http://blog.csdn.net/xijiaohuangcao/article/details/7839856
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);[/mw_shl_code]
下面贴上完整代码,
点击事件通过增加ClickableSpan来实现。
参考贴: http://blog.csdn.net/zwjemperor/article/details/7751913 ,
http://stackoverflow.com/questions/5575438/how-to-add-click-action-for-the-imagespan
[mw_shl_code=java,true]package com.example.edittext.img;
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);
}
}
}
[/mw_shl_code]