用字符串中的图像替换字符,然后设置为 Textview

Posted

技术标签:

【中文标题】用字符串中的图像替换字符,然后设置为 Textview【英文标题】:Replace the characters with Image in string and then set to Textview 【发布时间】:2012-09-29 11:50:23 【问题描述】:
This is :) and want to :) replace with :D new image.

我有这种类型的字符串,这是我从 EditTextbox 获得的。现在我想用 image1 替换所有“:)”,用 image2 替换“:D”。我想做类似 string.replaceall(":)" ,image1) 和 string.replaceall(":D",image2)。所以任何人都可以建议我如何用小代码和更好的性能来做到这一点。我已经编写了代码,它也可以正常工作,但需要很多时间。

textview.setText(getSmiledText(ctx, stringvalue));
private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>();
    static 
        emoticons.put(":)", R.drawable.j1);
        emoticons.put(":D", R.drawable.j2);

public static Spannable getSmiledText(Context context, String s) 
        int index;
        SpannableStringBuilder builder = new SpannableStringBuilder();
        builder.append(s);

        for (index = 0; index < builder.length(); index++) 
            for (Entry<String, Integer> entry : emoticons.entrySet()) 
                int length = entry.getKey().length();
                if (index + length > builder.length())
                    continue;
                if (builder.subSequence(index, index + length).toString()
                        .equals(entry.getKey())) 
                    builder.setSpan(new ImageSpan(context, entry.getValue()),
                            index, index + length,
                            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    index += length - 1;
                    break;
                
            
        
        return builder;
    

【问题讨论】:

it is working also fine 那又是什么问题? 我需要更好的解决方案来提高性能。这是可行的,但需要很长时间,因为它会逐个字符检查。所以我需要更好的解决方案 似乎setSpan 是最慢的部分......我在替换文本的背景颜色时遇到了类似的问题。 【参考方案1】:

检查这个:

public static Spannable getSmiledText(Context context, String s) 
    
    int index;
    SpannableStringBuilder builder = new SpannableStringBuilder();
    builder.append(s);

    for (Entry<String, Integer> entry : EmoticonsCode.emoticons_code.entrySet())
    
        try 
           int length = entry.getKey().length();
           for ( index = s.indexOf(entry.getKey()); index >= 0; index = s.indexOf(entry.getKey(), index + 1))
           
                System.out.println(index);
                builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
           
         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
   
   return builder;

【讨论】:

【参考方案2】:

您需要做的只是提前而不是在运行时加载图像,加载图像并保存在变量中,然后在运行时分配图像。仅供参考字符不是问题,我之前遇到过同样的问题,我将其理解为接触点问题,但问题是加载图像。

【讨论】:

你能解释一下如何预先加载图像吗?我已经设置了这样的图像 emoticons.put(":)", R.drawable.j1); emoticons.put(":D", R.drawable.j2);那么现在我该怎么办? 位图位图 = BitmapFactory.decodeResource(getResources(), R.drawable.j1);位图 bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.j2); builder.setSpan(位图,索引,索引+长度,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);我希望这会有所帮助。 你也可以把字符串和位图放到你的hashmap中。 但是如果我在像 R.draweable.j1 这样的哈希图中设置了图像,那么它和这个位图有什么不同 不同的是你已经加载了这个 emoticons.put(":)", BitmapFactory.decodeResource(getResources(), R.drawable.j1));

以上是关于用字符串中的图像替换字符,然后设置为 Textview的主要内容,如果未能解决你的问题,请参考以下文章

用NSAttributedString中的图像替换微笑

AS3 用图像字符替换字符串/文本

如何将可绘制背景设置为仅将数字字符串转换为 android 中的另一个字符串?

用基于该字符串的变量替换bash中的字符串[重复]

用excel中的VBA,然后根据excel中单元格中内容,批量替换一个word的模板doc中的字符。字符有很多处。

用字符串连接替换变量