您的位置:首页 > 其它

多应用中EditText中可以插入图片,并且图片可以响应点击事件来进行相关操作。

2015-04-24 19:30 477 查看
看到很多应用中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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐