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). Кажется, вход даже не зарегистрирован.

0 ответов

Другие вопросы по тегам