我刚刚构建了一个简单的聊天应用程序,它只包含一个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 是字符,E 是表情符号):
`CEC` works
`CEE` works NOT!
`EEE` works
`EEC` works
这个问题似乎是由editText.setText(editText.getText())
. 但我不知道,为什么这在大多数情况下都有效,但有时却无效。
++编辑++
@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 似乎“知道”文本将提前一行更改。通常,我希望如果该行导致问题,则该行(A)之前setText(...);
的文本长度必须比 B 大 1(或 2)并且表情符号在. 但是 A = B 所以表情符号在到达之前就丢失了。setText(...);
setText(...);
这也可以通过使用onTextChanged
方法观察到。此方法中文本的长度(如果出错)等于文本更改前的长度(X)。似乎输入甚至没有注册。