EditText 添加表情

本文详细介绍了如何在EditText中添加表情,通过ImageSpan和SpannableString的使用,展示了设置图片与字符串结合的步骤。文章通过实例演示了start和end参数的影响,解释了不同flags的含义,并提醒在实际操作中应注意光标位置的处理,确保表情插入在正确位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现功能:给EditText添加表情

实现效果:

实现步骤:1.布局就放个EditText,跟一个button按钮

   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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值