EditText中的表情符号

6
我正在尝试使用EditText实现一个带表情符号的活动(我的代码在末尾)。
除了一个细节外,代码运行完美。如果我在EditText中键入“.sa.”,它将被img1替换,但是如果我想撤销它,我需要点击4次删除才能使图像消失(每个关键字字符一次)。
这是我第一次使用Spannables,不知道该如何解决。你能帮我吗?
public class MytestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        EditText et = (EditText) findViewById(R.id.editText1);
        et.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) {
                getSmiledText(MytestActivity.this, s);
                Log.e("",s.toString());

            }
        });
    }

    private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>();
    static {
        emoticons.put(".sa.", R.drawable.img1);
        emoticons.put(".sb.", R.drawable.img2);
    }

    public static Spannable getSmiledText(Context context, Editable builder) {

        int index;
        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;
    }
}

我在这里做类似的事情!!!https://dev59.com/IGQn5IYBdhLWcg3wg3eR - Etienne Lawlor
2个回答

3
您可以尝试这样做:
public void beforeTextChanged(CharSequence s, int start,
        int count, int after) {
    try {
        if (count == 1 && after == 0 &&// tried to delete a char
                s.length() >= ".sa.".length() && // string could contain an emoticon
                s.subSequence(start - ".sa.".length() + 1, start + 1).toString().equals(".sa.")// the last string is .sa.
                ) {
            et.setText(s.subSequence(0, s.length() - ".sa.".length()));
        }
    } catch (Exception e) {
    }
}

这将引起另外几个问题(您将看到),它远非完美解决方案,我只是想给您一个实现的思路。当然,您必须替换".sa."字符串的使用方式;我为简单考虑硬编码了它。

1

通过监听事件捕获退格键,然后再执行3次(或手动删除图像空间),这个方案怎么样?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接