В 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);

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


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())

Выполнено!


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

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.


-1

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
Это точно работает, но это не очень приятный пользовательский опыт. Я только что попробовал, и поскольку клавиатура не автокапитализируется (по крайней мере, на N), символы нижнего регистра просто игнорируются без обратной связи с пользователем, из-за чего пользовательский интерфейс кажется сломанным.
MattMatt

полностью согласен с @MattMatt. Если мы это сделаем, пользователь не сможет вводить строчные буквы. Пользователь должен иметь возможность вводить любой регистр, который он / она хочет, а остальные должны автоматически
Мир Аднан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.