Як змусити писати великі регістри в Android EditText?


144

У моєму додатку для Android я різний, EditTextде користувач може вводити інформацію. Але мені потрібно змусити користувача писати великими літерами. Чи знаєте ви функцію для цього?

Відповіді:


340

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

21
Або в Котліні простоeditText.filters = editText.filters + InputFilter.AllCaps()
Ілля Куртов

4
А ще краще: editText.filters += InputFilter.AllCaps()Котлін чудовий! <3
Мілак27

123

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


39
ніщо не заважає Користувачеві натиснути «shift» і написати лист з нижнього регістру.
Фернандо Ліал

Погодьтеся з Фернандо, хоча він за замовчуванням клавіатури не має значень, вони не вимагають їх.
pforhan

Користувач може скористатися кнопкою "shift", щоб ввести маленьку літеру, як сказав @Fernando
Ajinkya


18

Можна використовувати двосторонній спосіб.

Перший шлях:

Встановіть android:inputType="textCapSentences"у своєму редакційному тексті.

Другий шлях:

Коли користувач вводить номер, ви повинні використовувати текстовий інструмент і змінити малу на велику літеру.

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

2
ваше рішення не працює, оскільки він встановлює рядок у зворотному порядку.
co2f2e

яким способом ви користувались першим чи другим.
Харшид

По-перше, це взагалі не працює. Другий - це верхній регістр тексту, але ми повинні програмно встановити курсор на кінець речення.
co2f2e

@Kalanamith ya, в чому проблема
Харшид

6
Для першого варіанту textCapSentences з великої літери використовуються речення, вам потрібні textCapCharacters.
Ghoti

13

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


@GustavoAlves, Ви можете просто сказати мені, що сталося, коли ви спробували це? Можливо, я можу розглянути ваше питання. :)
Абхішек

Привіт @Abhishek Налаштування властивості нічого не змінило. EditText все ще приймає як великі, так і малі символи.
Gus Costa

1
Так, якщо ви хочете обмежити ваш EditText лише для того, щоб прийняти великі символи, то для вас, android: inputType = "textCapCharacters" був би правильним варіантом. Спробуйте, а потім дайте мені знати. ☺️
Абхішек

1
Це спричинило та індексує виняток поза межами, коли кожен я вводив текст.
Zapnologica

2
android:textAllCaps="true"є лише властивістю TextView ( stackoverflow.com/a/28803492/5268730 ). Використовуйте android:inputType="textCapCharacters"замість цього.
woodii

11

Ви повинні помістити android:inputType="textCapCharacters"з Edittext у xml файл.


9
AoyamaNanami написав абсолютно таку ж відповідь. Будь ласка, зосередьтесь на більш актуальних питаннях, це з 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()
Макотосан

8
Ще краще:<your_edit_text>.filters += InputFilter.AllCaps()
Макотосан

9

У kotlin , у .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"
    />

Це дозволить оновити клавіатуру, як увімкнено верхній регістр.


8

Використовуйте вхідний фільтр

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

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

4

Для мене це працювало, додаючи 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"
                    />

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

1

Щоб отримати велику клавіатуру при натисканні редагування тексту, використовуйте цей код у вашому 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.

EDIT: Відмінності в поведінці, які я спостерігав і вважав пов’язаними з ОС, були насправді тому, що у мене на тестових пристроях були різні версії клавіатури Google. Після того, як я оновив пристрої до останньої клавіатури Google (вийшла липня 2016 року з моменту написання цього повідомлення), поведінка "Усі капи" була послідовною у всіх ОС. Тепер на всіх пристроях відображаються малі символи на клавіатурі, але вхід - All Caps через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 еквівалент відповіді ЕрлВолтона:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());

Ось чому я люблю, як C # може бути таким стислим.
Ліонет Чен

1

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

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

PS для мене filtersспочатку завжди порожній


0

Язиком 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. Якщо ми це зробимо, користувач не зможе вводити маленькі літери. Користувач повинен мати можливість вводити будь-який випадок, який він бажає, а решта має автоматично прописувати великі слова
Mir Adnan,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.