Android的跨区文本,而删除的笑容显示文本 [英] Android Spanned Text while deleting smiles shows text
问题描述
我 SpannedText
在的EditText
,我用微笑例如替换文本的酷替换的笑容。但是,当我的Android手机上pressing Backspace键(Nexus 5的奇巧4.4.4)显示(笑)凉,那么它最后的笑容还删除字母。但在 Genymotion 模拟器它的工作原理是必要的。有什么不对我的code?
这code是在
可绘制D = Drawable.createFromStream(IMS,NULL);
位图B =((BitmapDrawable)D).getBitmap();
INT spanSmileHeight =(displayHeight> displayWidth)? ((INT)((双)displayHeight / 25))((INT)((双)displayWidth / 25));
INT spanSmileWidth =((INT)((双)spanSmileHeight / b.getHeight())* b.getWidth())+ 15;
位图bitma presized = Bitmap.createScaledBitmap(B,spanSmileWidth,spanSmileHeight,FALSE);
可绘制SD =新BitmapDrawable(getResources(),bitma presized);
sd.setBounds(0,0,spanSmileWidth,spanSmileHeight);
addPattern(表情符号,笑脸code,SD);
...ImageView.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(查看视图){
INT开始= Math.max(message.getSelectionStart(),0);
INT结束= Math.max(message.getSelectionEnd(),0);
message.getText()取代(Math.min(开始,结束),Math.max(开始,结束)
笑脸code,0,笑脸code.length());
message.setText(getSmiledText(view.getContext(),message.getText()));
message.setSelection(启动+笑脸code.length());
这
公共静态布尔addSmiles(上下文的背景下,Spannable spannable){
布尔hasChanges = FALSE;
对于(Map.Entry的<模式,可绘制>项:emoticons.entrySet()){
。匹配匹配= entry.getKey()匹配(spannable);
而(matcher.find()){
布尔设置为TRUE;
对于(ImageSpan跨度:spannable.getSpans(matcher.start()
matcher.end(),ImageSpan.class))
如果(spannable.getSpanStart(跨度)> = matcher.start()
&功放;&安培; spannable.getSpanEnd(跨度)< = matcher.end())
spannable.removeSpan(跨度);
其他{
设置= FALSE;
打破;
}
如果(套){
hasChanges = TRUE;
spannable.setSpan(新ImageSpan(entry.getValue(),ImageSpan.ALIGN_BOTTOM),
matcher.start(),matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
返回hasChanges;
} 公共静态Spannable getSmiledText(上下文的背景下,为CharSequence文本){
Spannable spannable = spannableFactory.newSpannable(文本);
addSmiles(背景下,spannable);
返回spannable;
}
bacspace之前
pressed
(虚拟keyobard)退格后
日志输出:
6月9日至1日:22:21.280 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过* * **猫猫*
6月9日至1日:23:32.060 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过** **猫猫
6月9日至1日:23:32.080 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过** **猫
6月9日至1日:23:32.084 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过** **猫猫
3次以上。
6月9日至1日:24:07.980 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过* * **猫CA
6月9日至1日:24:08.264 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过** **猫ç
6月9日至1日:24:08.668 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过** **猫
在这里,笑容删除
6月9日至1日:24:09.248 1271年至1271年/ com.nnadir.wapchat.app I / wapChat:* **悲悲悲** ** **伤心难过* *猫*
我已经找到一种方法如何prevent这一点。如果我们改变targetSDK到15,然后微笑被删除成功。
I have SpannedText
in EditText
and I am replacing text with smiles for example cool replaced with smile. But when I am pressing Backspace on android phone (Nexus 5 kitkat 4.4.4) it shows "(Smile)cool" then it deletes the letters at last the smile itself. But on Genymotion emulator it works as needed. What is wrong with my code?
This code is in for
Drawable d = Drawable.createFromStream(ims, null);
Bitmap b = ((BitmapDrawable)d).getBitmap();
int spanSmileHeight = (displayHeight>displayWidth) ? ((int) ((double) displayHeight/25)) : ((int) ((double) displayWidth/25));
int spanSmileWidth = ((int) ((double) spanSmileHeight/b.getHeight())*b.getWidth())+15;
Bitmap bitmapResized = Bitmap.createScaledBitmap(b, spanSmileWidth, spanSmileHeight, false);
Drawable sd = new BitmapDrawable(getResources(), bitmapResized);
sd.setBounds(0, 0, spanSmileWidth, spanSmileHeight);
addPattern(emoticons, smileyCode, sd);
...
ImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int start = Math.max(message.getSelectionStart(), 0);
int end = Math.max(message.getSelectionEnd(), 0);
message.getText().replace(Math.min(start, end), Math.max(start, end),
smileyCode, 0, smileyCode.length());
message.setText(getSmiledText(view.getContext(), message.getText()));
message.setSelection(start + smileyCode.length());
and this
public static boolean addSmiles(Context context, Spannable spannable) {
boolean hasChanges = false;
for (Map.Entry<Pattern, Drawable> entry : emoticons.entrySet()) {
Matcher matcher = entry.getKey().matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(),
matcher.end(), ImageSpan.class))
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end())
spannable.removeSpan(span);
else {
set = false;
break;
}
if (set) {
hasChanges = true;
spannable.setSpan(new ImageSpan(entry.getValue(), ImageSpan.ALIGN_BOTTOM),
matcher.start(), matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
return hasChanges;
}
public static Spannable getSmiledText(Context context, CharSequence text) {
Spannable spannable = spannableFactory.newSpannable(text);
addSmiles(context, spannable);
return spannable;
}
Before bacspace
After backspace(of virtual keyobard) pressed
The log output:
09-01 06:22:21.280 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat*
09-01 06:23:32.060 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat
09-01 06:23:32.080 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**
09-01 06:23:32.084 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**cat
3 more times
09-01 06:24:07.980 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**ca
09-01 06:24:08.264 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**c
09-01 06:24:08.668 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat**
And here smile deleted
09-01 06:24:09.248 1271-1271/com.nnadir.wapchat.app I/wapChat﹕ *sad**sad**sad**sad**sad**cat*
I have found a way how to prevent this. If we change targetSDK to 15 then smiles are deleted succesfully.
这篇关于Android的跨区文本,而删除的笑容显示文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!