В Android EditText, как заставить писать прописные буквы?

147

В моем приложении для Android у меня другое место, EditTextгде пользователь может вводить информацию. Но мне нужно заставить пользователя писать заглавными буквами. Вы знаете функцию для этого?

Наташа
источник

Ответы:

345

Android на самом деле имеет встроенный InputFilter только для этого !

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});

Будьте осторожны, setFilters сбросит все другие атрибуты , которые были установлены с помощью XML (то есть maxLines, inputType, imeOptinos...). Чтобы предотвратить это, добавьте свои фильтры к уже существующим.

InputFilter[] editFilters = <EditText>.getFilters();
InputFilter[] newFilters = new InputFilter[editFilters.length + 1];
System.arraycopy(editFilters, 0, newFilters, 0, editFilters.length);
newFilters[editFilters.length] = <YOUR_FILTER>;  
<EditText>.setFilters(newFilters);
ErlVolton
источник
3
Да! Это лучший ответ! Код должен быть edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});хоть.
Артур
4
Хорошо, ребята были правы, я обновил свой ответ. Спасибо за помощь в улучшении !!
ErlVolton
4
Для того, чтобы избежать переопределения фильтры , установленные на XML (например , для. maxLength), Пытаются присоединить InputFilter.AllCaps()к editText.getFiltersмассиву. См. Stackoverflow.com/a/18934659/3890983
tropicalfish
25
Или в Котлине простоeditText.filters = editText.filters + InputFilter.AllCaps()
Илья Куртов
6
Еще лучше: editText.filters += InputFilter.AllCaps()Котлин замечательный! <3
Milack27
126

Если вы хотите заставить пользователя писать заглавными буквами по умолчанию в вашем EditText, вам просто нужно добавить android:inputType="textCapCharacters". (Пользователь все еще может вручную перейти на строчные буквы.)

Аояма Нанами
источник
40
ничто не мешает пользователю нажать клавишу «shift» и написать букву в нижнем регистре.
Fernando Leal
Согласитесь с Фернандо, хотя он по умолчанию использует заглавные буквы, они не требуются.
pforhan
Пользователь может использовать кнопку Shift для ввода строчной буквы, как сказал @Fernando
Ajinkya
это хорошее решение, позволяющее заставить пользователя начинать и продолжать вводить заглавными буквами. Не заставляйте его, он все равно может писать строчными буквами с клавиатуры
sud007
24

Установите input typeзначение TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. keyboardДолжны соблюдать это.

Гейб Сечан
источник
android: inputType = "textCapCharacters"
Парт Капур
18

Вы можете использовать два способа.

Первый способ:

Установите android:inputType="textCapSentences"на свой EditText.

Второй способ:

Когда пользователь вводит номер, вы должны использовать средство просмотра текста и менять строчные буквы на заглавные.

edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
         edittext.setSelection(edittext.length()); //fix reverse texting
      }
    }
});  
Харшид
источник
3
ваше решение не работает, потому что оно устанавливает строку в обратном порядке.
co2f2e
каким способом вы использовали первый или второй.
Харшид
Первый вообще не работает. Второй переводит текст в верхний регистр, но мы должны программно установить курсор в конец предложения.
co2f2e
@Kalanamith ya, тогда в чем проблема
Harshid
6
Для первого варианта textCapSentences использует предложения с заглавной буквы, вам нужен textCapCharacters.
Ghoti
13

Вы можете добавить android:textAllCaps="true"свойство в свой XML-файл в EditText. Это приведет к тому, что клавиатура softinput будет отображаться в режиме заглавных букв. Введенное вами значение будет отображаться в верхнем регистре. Однако это не гарантирует, что пользователь сможет вводить только UpperCaseбуквы. Если они хотят, они все равно могут вернуться к строчным буквам. Если вы хотите, чтобы выходные данные были Edittextзаглавными, вам нужно вручную преобразовать входную строку с помощью toUpperCase()метода Stringкласса.

Абхишек
источник
@GustavoAlves, ты можешь просто сказать мне, что случилось, когда ты попробовал это? Может быть, я смогу разобраться в твоей проблеме. :)
Abhishek
Привет @Abhishek. Установка свойства ничего не изменила. EditText по-прежнему принимает символы как верхнего, так и нижнего регистра.
Гас Коста
1
Да, если вы хотите ограничить свой EditText только символами верхнего регистра, то для вас android: inputType = "textCapCharacters" будет правильным вариантом. Попробуйте, а затем дайте мне знать. ☺️
Abhishek
1
Это вызывало исключение и исключение индекса за пределами при каждом вводе.
Zapnologica
2
android:textAllCaps="true"является только свойством TextView ( stackoverflow.com/a/28803492/5268730 ). android:inputType="textCapCharacters"Вместо этого используйте .
woodii
11

Вы должны поместить android:inputType="textCapCharacters"Edittext в файл xml.

Пабель
источник
9
Аояма Нанами написал точно такой же ответ. Пожалуйста, сосредоточьтесь на более актуальных вопросах, этот от 2013 года. :)
ByteHamster
2
Обратите внимание, что пользователь может сдвигать и вводить нижние символы
Rafa0809
10

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

Следующий код должен помочь:

EditText edit = (EditText)findViewById(R.id.myEditText);
String input;
....
input = edit.getText();
input = input.toUpperCase(); //converts the string to uppercase

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

антоникр
источник
9

Еще лучше ... один лайнер в Котлине ...

// gets your previous attributes in XML, plus adds AllCaps filter    
<your_edit_text>.setFilters(<your_edit_text>.getFilters() + InputFilter.AllCaps())

Выполнено!

S Pimenta
источник
2
Вы можете написать это, используя синтаксис доступа к свойствам: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan
8
Еще лучше:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan
9

Использовать входной фильтр

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
Шриджеш К. Наир
источник
9

В котлине , в файле .kt внесите изменения:

edit_text.filters = edit_text.filters + InputFilter.AllCaps()

Используйте синтетическое свойство для прямого доступа к виджету с идентификатором. А в XML для текста редактирования добавьте еще пару флагов:

<EditText
    android:id="@+id/edit_text_qr_code"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    ...other attributes...
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
    />

Это обновит клавиатуру при включении верхнего регистра.

Вишну Бенни
источник
7

Для меня это сработало, добавив android: textAllCaps = "true" и android: inputType = "textCapCharacters"

<android.support.design.widget.TextInputEditText
                    android:layout_width="fill_parent"
                    android:layout_height="@dimen/edit_text_height"
                    android:textAllCaps="true"
                    android:inputType="textCapCharacters"
                    />
Удара Абейтхилаке
источник
6
edittext.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {            

    }
        @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {             
    }
    @Override
    public void afterTextChanged(Editable et) {
          String s=et.toString();
      if(!s.equals(s.toUpperCase()))
      {
         s=s.toUpperCase();
         edittext.setText(s);
      }
      editText.setSelection(editText.getText().length());
    }
});  
Андерсон Карвалью
источник
6

Просто сделай это:

// ****** Every first letter capital in word *********
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textCapWords"
    />

//***** if all letters are capital ************

    android:inputType="textCapCharacters"
Правин Сутхар
источник
5

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

программно:

editText.filters = editText.filters + InputFilter.AllCaps()

XML:

android:inputType="textCapCharacters" with Edittext
Nivedh
источник
3

Чтобы получить весь капитал, используйте в своем XML следующее:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>
Акшай Шетти
источник
2
вы пробовали это решение? это приводит к сбою приложения, когда пользователь начинает редактировать содержимое editext
surhidamatya
3

попробуйте этот код, он сделает ваш ввод в верхнем регистре

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});
Агил Анбу
источник
2

Основываясь на принятом ответе, этот ответ делает то же самое, но в Котлине. Просто для облегчения копирования: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}
Рок Боронат
источник
1
filters += InputFilter.AllCaps(): D
crgarridos
Омг, это даже лучше! Спасибо @crgarridos!
Roc Boronat,
2

Простая реализация котлина

fun EditText.onlyUppercase() {
    inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
    filters = arrayOf(InputFilter.AllCaps())
}

PS вроде filtersвсегда изначально пусто

Влад
источник
1

Чтобы получить клавиатуру с заглавной буквы при нажатии edittext, используйте этот код в своем xml,

<EditText
    android:id="@+id/et"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:hint="Input your country"
    android:padding="10dp"
    android:inputType="textCapCharacters"
    />
Ашана.Джаколь
источник
1

Я использую Visual Studio 2015 / Xamarin для создания своего приложения как для Android 5.1, так и для Android 6.0 (на обоих установлен один и тот же apk).

Когда я указал android:inputType="textCapCharacters"в своем axml, клавиатура AllCaps появилась, как и ожидалось, на Android 6.0, но не на Android 5.1. Я добавил android:textAllCaps="true"в свой axml, но все еще нет клавиатуры AllCaps на Android 5.1. Я установил фильтр, используя, EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });и, хотя программная клавиатура показывает символы нижнего регистра в Android 5.1, поле ввода теперь AllCaps.

РЕДАКТИРОВАТЬ: Поведенческие различия, которые я наблюдал и предполагал, что они связаны с ОС, были на самом деле потому, что у меня были разные версии Google Keyboard на тестовых устройствах. После того, как я обновил устройства до последней версии Google Keyboard (выпущенной в июле 2016 г. на момент написания этой статьи), поведение «Все заглавные буквы» стало одинаковым для всех операционных систем. Теперь все устройства показывают символы нижнего регистра на клавиатуре, но вводится заглавными буквами из-заSetFilters(new IInputFilter[] { new InputFilterAllCaps() });

Тони
источник
1
Привет, Тони, кажется, вы создали 2 аккаунта; stackoverflow.com/users/6764633/tony-celia и stackoverflow.com/users/6771440/deeveedee . Если вы хотите их объединить, см. Stackoverflow.com/help/merging-accounts .
Мэтт
Спасибо, Мэтт. Отнесите это к новичкам / ошибкам. Не помнил, что создавал другую учетную запись, пока вы не указали на это. К счастью, функция слияния учетных записей была простой. Отличный форум!
Тони
1

Xamarin эквивалент ответа ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
стовроз
источник
Вот почему мне нравится, насколько лаконичен C #.
Lionet Chen
0

Java 1-лайнер предлагаемого решения может быть:

editText.setFilters(Lists.asList(new InputFilter.AllCaps(), editText.getFilters())
    .toArray(new InputFilter[editText.getFilters().length + 1]));

Обратите внимание на необходимость com.google.common.collect.Lists.

Boriguen
источник
-1

Просто добавьте код ниже в свой EditText вашего XML-файла.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

И если вы хотите разрешить и текст в верхнем регистре, и цифры, используйте код ниже.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Хусбу
источник
2
Это точно работает, но это не очень приятный пользовательский опыт. Я только что попробовал, и поскольку клавиатура не автокапитализируется (по крайней мере, на N), символы нижнего регистра просто игнорируются без обратной связи с пользователем, из-за чего пользовательский интерфейс кажется сломанным.
MattMatt
полностью согласен с @MattMatt. Если мы это сделаем, пользователь не сможет вводить строчные буквы. Пользователь должен иметь возможность вводить любой регистр, который он / она хочет, а остальные должны автоматически
Мир Аднан