Заглавная буква для EditText с вводом GBoard

Я пытаюсь программно настроить "Заглавные буквы" (потому что я установил EditText в ListView)

Существует много тем, связанных с этой проблемой, и самая известная из них — , которую я предполагать. Я пробовал решения, представленные там, и

setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_CAP_SENTENCES)

действительно помогает. Исключение — когда пользователь использует GBoard (клавиатуру Google), это не помогает. (Автоматическое использование заглавных букв не отключено)

Итак, можно ли заставить его работать на GBoard? или, может быть... возможно ли программно press shift когда в edittext нет текста?


person Siarhei    schedule 08.08.2017    source источник
comment
Нет (известно, что я мог бы найти) способа переопределить это. Лучший выбор (и самый безопасный с точки зрения различных производителей-беспорядок-с-андроидом-все время) - это комбинация того, что вы уже делаете, и текстового прослушивателя для заглавной буквы первой буквы CharSequence ( или когда поле теряет фокус, если это происходит в вашем случае). Рассмотрите также CapWords как флаг, если он работает (потому что он имеет тенденцию работать независимо от переключателя Board). Но в целом, лучшее решение - сделать и то, и другое.   -  person Martin Marconcini    schedule 09.08.2017


Ответы (1)


У меня была такая же проблема с Gboard, и я решил ее следующим образом:

final EditText editText = (EditText) findViewById(R.id.editText);
editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        //Check if the entered character is the first character of the input
        if(start == 0 && before == 0){
            //Get the input
            String input = s.toString();
            //Capitalize the input (you can also use StringUtils here)
            String output = input.substring(0,1).toUpperCase() + input.substring(1);
            //Set the capitalized input as the editText text
            editText.setText(output);
            //Set the cursor at the end of the first character
            editText.setSelection(1);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

Обратите внимание, что это только обходной путь, если вам действительно нужно выполнить работу на клавиатурах, которые не поддерживают стандартный способ сделать первую букву заглавной.

Он делает первый символ ввода заглавным (цифры и специальные символы игнорируются). Единственный недостаток в том, что ввод с клавиатуры (в нашем случае Gboard) по-прежнему показывает строчные буквы.

Подробное объяснение параметров onTextChanged см. в этом ответе.

person Mathis    schedule 16.04.2019
comment
Поправьте меня, если я ошибаюсь, но это не позволит пользователю намеренно сделать первую букву маленькой, например. удалить заглавную и ввести строчную букву в качестве первой? - person Sandra; 26.03.2020