我刚刚构建了一个简单的聊天应用程序,它只包含一个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)。似乎输入甚至没有注册。