Android的跨区文本,而删除的笑容显示文本 [英] Android Spanned Text while deleting smiles shows text

查看:176
本文介绍了Android的跨区文本,而删除的笑容显示文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

SpannedText 的EditText ,我用微笑例如替换文本的替换的笑容。但是,当我的Andr​​oid手机上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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆