Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android的edittext中使用Spanable_Android_Hashmap_Android Edittext_Textwatcher_Spannable - Fatal编程技术网

在android的edittext中使用Spanable

在android的edittext中使用Spanable,android,hashmap,android-edittext,textwatcher,spannable,Android,Hashmap,Android Edittext,Textwatcher,Spannable,我把这段代码放在了答案中,用于在Edittext中显示表情,但当我键入大量文本时,我遇到了一个问题,它变得越来越慢,几乎无法键入。 这是代码:我如何使它更快 textS.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) {

我把这段代码放在了答案中,用于在Edittext中显示表情,但当我键入大量文本时,我遇到了一个问题,它变得越来越慢,几乎无法键入。 这是代码:我如何使它更快

 textS.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {
                addSmiledText(Main.this, s);
               // Log.e("",s.toString());

            }
        });}


     private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>();
     static {
         emoticons.put(":)", R.drawable.face_smile);
         emoticons.put(":-)", R.drawable.face_smile);
         emoticons.put(":(", R.drawable.face_sad);
         emoticons.put(":-(", R.drawable.face_sad);
         emoticons.put(":-D", R.drawable.face_smile_big);
         emoticons.put(":D", R.drawable.face_smile_big);
         emoticons.put(":lol:", R.drawable.face_laughing);
            emoticons.put("8)", R.drawable.face_cool);
            emoticons.put(";)", R.drawable.face_wink);
           emoticons.put(";-)", R.drawable.face_wink);
            emoticons.put(";(", R.drawable.face_crying);
           ...

     }
     public static Spannable addSmiledText(Context ch, Editable s) {

            int index;
            for (index = 0; index < s.length(); index++) {
                for (Entry<String, Integer> entry : emoticons.entrySet()) {
                    int length = entry.getKey().length();
                    if (index + length > s.length())
                        continue;
                    if (s.subSequence(index, index + length).toString().equals(entry.getKey())) {
                        s.setSpan(new ImageSpan(ch, entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                        index += length - 1;
                        break;
                    }
                }
            }
            return s;
        }
text.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
公共无效后文本已更改(可编辑){
addSmiledText(Main.this,s);
//Log.e(“,s.toString());
}
});}
私有静态最终HashMap表情=新HashMap();
静止的{
表情符号。放(“:”,R。可画。脸(微笑);
表情符号。放(“:-”,R。可画。脸(微笑);
表情符号。放(“:(”,R。可画。脸上悲伤);
表情符号。放(“:-(”,R。可画。脸上悲伤);
表情符号。放(“:-D”,R。可画。脸上的笑容大);
表情符号。放置(“:D”,R。可画。脸(笑)大);
表情符号。放置(“:lol:”,R.可画。脸笑);
表情符号。放置(“8)”,右侧可绘制。面部表情(酷);
表情符号。放(;)”,R。可画。脸(眨眼);
表情符号。放(;-)”,R。可画。脸(眨眼);
表情符号。放(;(;,R。可画。脸哭);
...
}
公共静态SPANABLE addSmiledText(上下文ch,可编辑的s){
整数指数;
对于(索引=0;索引s.长度())
继续;
if(s.subSequence(index,index+length).toString().equals(entry.getKey())){
s、 setSpan(新图像SPAN(ch,entry.getValue()),索引,索引+长度,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
指数+=长度-1;
打破
}
}
}
返回s;
}
如何使它只扫描最后两个字符

你有:

for (index = 0; index < s.length(); index++)
for(索引=0;索引
如果不希望每次扫描整个字符串,请为
索引选择一个更好的起始值

例如,由于最小长度的表情符号有两个字符,而最大长度的表情符号有五个字符,因此对于长度为0或1的
Editable
对象,完全跳过循环,然后从
s.length()-5
开始执行
index


注意,<代码> TeaTeXeXeDeD()/Cyto>不仅要求在结尾进行更改。用户可能已经将光标重新定位到中间的某个位置。因此,您确实应该在<代码> OnTeXCudid()中进行扫描。

并查看更改点周围的文本窗口。

以便扫描最后2个字符,而不是

for (index = 0; index < s.length(); index++)

通过这种方式,您可以从最后一个元素开始向后循环,直到循环两个位置。

当您使用Traceview分析代码时,您发现了什么?谢谢您的回答。我没有使用Traceview。您认为我应该使用吗?您能提供一些链接以了解如何执行此操作吗?您将发现,在整个过程中一次扫描一个字符如果最后一个输入的字符以某种方式创建了一个表情符号,那么整个字符串并不是一个非常有效的方法。我知道这不是很有效,但是如何使它只扫描最后两个字符呢?例如,我插入“ab”,它扫描=ab,然后我添加“c”=“abc”它只扫描bc。也许你应该看看使用TransformationMethod,它似乎是为这类事情设计的?谢谢你的指导,我会尝试这样设置。再次感谢你。:)好的,我尝试了两天使它工作,但什么都没有。。。如果我可以将其设置为从s.length()到-5的范围,它将不会显示表情符号。它只能像我上面贴的那样工作,但速度非常慢。所以我真的不知道该怎么办了。也许我应该换个方式试试,你觉得呢?这是一种不好的方法吗?@Natasa.M:我从来没有尝试过实现表情转换算法。也就是说,其他人已经实现了它们,可能已经实现了数百次,所以我将专注于寻找一个有效的现有算法。
int start = s.length() - 1;
int end = start - 2;
for (index = start; index > end; index--)