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 classMainActivity extends Activity {private final String TAG = "MainActivity";privateEditText eText;private intspanEnd;
@Overridepublicboolean 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 voidonCreate(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= newImageGetter() {
@OverridepublicDrawable getDrawable(String source) {int id =Integer.parseInt(source);//根据id从资源文件中获取图片对象
Drawable d =getResources().getDrawable(id);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());returnd;
}
};
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(newOnClickListener() {
@Overridepublic voidonClick(View v) {//TODO Auto-generated method stub
SpannableString ss = newSpannableString(imgStr);
Drawable drawable=getResources().getDrawable(
R.drawable.hungry_1);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan imageSpan= newImageSpan(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 ,"");
}
});
button2.setOnClickListener(newOnClickListener(){public voidonClick(View v) {
SpannableString ss= newSpannableString(imgStr);
Drawable drawable=getResources().getDrawable(
R.drawable.bad_smelly);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
ImageSpan imageSpan= newImageSpan(drawable,
ImageSpan.ALIGN_BASELINE);
ss.setSpan(imageSpan,0, imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
eText.append(ss);
setSpanClickable();
eText.append("");
}
});
button3.setOnClickListener(newOnClickListener() {
@Overridepublic voidonClick(View v) {
eText.append(Html.fromHtml("",
imageGetter,null));
setSpanClickable();
}
});
}private OnClickListener textListener = newOnClickListener() {//此方法不靠谱
@Overridepublic voidonClick(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 voidsetSpanClickable() {//此方法比较靠谱
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();
finalint start =s.getSpanStart(span);
finalint end =s.getSpanEnd(span);
spanEnd=end;
Log.i(TAG,"setSpanClickable , image_src ="+image_src+", start ="+start+", end ="+end);
ClickableSpan click_span= newClickableSpan() {
@Overridepublic voidonClick(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);
}
}
}