Android EditText删除了Emojis

时间:2016-01-20 12:30:50

标签: android android-edittext emoji imagespan

我刚刚构建了一个简单的聊天应用程序,它只包含一个EditText。我将inputType设置为textShortMessage。现在您可以输入表情符号了。

问题在于,某些组合中的表情符号甚至没有输入或消失。

代码看起来像这样(大部分是由AndroidStudio生成的,我添加了TextWatcher):

public class MainActivity extends AppCompatActivity {

    private boolean updateText = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText editText = (EditText)findViewById(R.id.editText);
        editText.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) {
                if (updateText) {
                    updateText = false;
                    editText.setText(editText.getText());    // cause problems
                } else
                    updateText = true;
            }
        });
    }
}

可以通过键盘输入字符和表情符号(我猜是ImageSpan)(我使用虚拟设备的标准键盘)。但是有些组合不能按预期工作。

如果你把光标放在正常字符之后但之前表情符号,你试图输入另一个表情符号,它就不会出现。

您可以尝试通过最后交换中间部分来生成以下模式(C是char,E是表情符号):

`CEC`   works
`CEE`   works NOT!
`EEE`   works
`EEC`   works

此问题似乎是由editText.setText(editText.getText())引起的。但我不知道,为什么这种情况大部分时间都有效,但有时候却没有。

++ ++ EDIT

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (updateText)
    System.out.println("X "+editText.getText().length());
}

@Override
public void afterTextChanged(Editable s) {
    if (updateText) {
        updateText = false;
        System.out.println("A " + editText.getText().length());
        editText.setText(editText.getText());
        System.out.println("B "+editText.getText().length());
    } else
        updateText = true;
}

如果你键入一个普通的字符:X是1(或表情符号2,因为它可能由两个字符组成)小于A和B.这也适用于

//editText.setText(editText.getText());

如果导致问题:X = A = B

这非常令人不安,因为这意味着A''知道'文本将提前一行更改。通常情况下,如果setText(...);行导致问题,此行(A)的长度必须比B大1(或2)并且表情符号丢失期间setText(...);。但是A = B所以表情符号在 setText(...);到达之前就已经了。

使用onTextChanged方法也可以观察到这一点。此方法中文本的​​长度(如果出现错误)等于文本更改前的长度(X)。似乎输入甚至没有注册。

0 个答案:

没有答案