实现功能:给EditText添加表情
实现效果:
2.代码片段:
public class MainActivity extends Activity {
private EditText et;
private SpannableString spannableString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=(EditText) findViewById(R.id.et);
ImageSpan imageSpan=new ImageSpan(MainActivity.this, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
spannableString=new SpannableString("abcdefghijk"); //用一串字符串代表这张图片
spannableString.setSpan(imageSpan, 0, 11, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
public void add(View v){
et.append(spannableString);
}
}
运行效果如下:
哈哈哈,得来全部费功夫,再点一下?怎么变这样?
继续点。纳尼!!什么鬼!
经过本人的猜想,估计是一个imageSpan对象绑定了一张图片R.drawable.ic_launcher,由于第二次点击时候是在add方法里直接添加,并没有重复创建对象了,所以出现这种情况(大白的思想:乱猜)
那么就来改一改把:
public class MainActivity extends Activity {
private EditText et;
private SpannableString spannableString;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=(EditText) findViewById(R.id.et);
}
public void add(View v){
ImageSpan imageSpan=new ImageSpan(MainActivity.this, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
spannableString=new SpannableString("abcdefghijk");
spannableString.setSpan(imageSpan, 0, 11, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
et.append(spannableString);
}
}
运行效果:
嘿嘿嘿。总算出来了,看来猜的没错。那接下来就简单讲讲几行代码把。
//创建一个ImageSpan 对象,用来标识一张图片。
ImageSpan imageSpan=new ImageSpan(MainActivity.this, BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
//用一串字符串准备来标识那张图片
spannableString=new SpannableString("abcdefghijk");
//讲图片跟字符串结合
spannableString.setSpan(imageSpan, 0, 11, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
我们来注意下这几个参数:
setSpan(Object what,int start,int end,int flags)
Object what:准备与它结合的ImageSpan
int start:表示图片的字符串的起始长度
int end:表示图片的字符串的终点长度
int flags:关于字符串的一些标志属性
那我们来看看这个start跟end,说的有点含糊,实践才是检验真理的唯一标准。
1.改为2,4试试
spannableString.setSpan(imageSpan, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
运行结果:
意思是:代表图片的字符串为"abcdefghijk",从下标2开始到下标4之前将显示为图片,即“cd”代表图片
2.改为0,12试试,此时字符串的长度为11,好吧。数组越界了。
Caused by: java.lang.IndexOutOfBoundsException: setSpan (0 ... 12) ends beyond length 11
现在清楚了吧?最后简单讲一下 falgs,有四个状态
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE; //前后都不包括
Spannable.SPAN_EXCLUSIVE_INCLUSIVE; //前面不包括,后面包括
Spannable.SPAN_INCLUSIVE_EXCLUSIVE; //前面包括,后面不包括
Spannable.SPAN_INCLUSIVE_INCLUSIVE; //前后都包括
这个是标识在 Span 范围内的文本前后输入新的字符时是否把它们也应用这个效果
由于这里主要讲表情,就不涉入太多,借用别人的一张图,这哥们博客。http://aichixihongshi.iteye.com/blog/1207503
最后,说下需要注意的地方:
上文中我直接用et.append(spannableString);这会导致每一次添加表情都添加在文本的最后,显然不是我们想要的,一般都是添加在光标后面。修改如下:
int currentPosition = et.getSelectionStart();//得到当前光标位置
et.getText().insert(currentPosition,spannableString);