Android EditText удаляет эмодзи
Я только что построил простое приложение для чата, которое состоит только из одного 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())
, Но я не знаю, почему это работает большую часть времени, а иногда нет.
++ 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) должна быть на 1 (или 2) больше, чем B, и эмодзи теряется во время setText(...);
, Но A = B, поэтому эмодзи теряется раньше setText(...);
даже достигнуто.
Это также можно наблюдать с помощью onTextChanged
метод. Длина текста (в случае ошибки) в этом методе равна длине до изменения текста (X). Кажется, вход даже не зарегистрирован.