W Androidzie EditText, jak wymusić pisanie wielkich liter?

144

W mojej aplikacji na Androida mam inne miejsce, w EditTextktórym użytkownik może wprowadzać informacje. Ale muszę zmusić użytkownika do pisania wielkimi literami. Czy znasz funkcję, która to robi?

Natacha
źródło

Odpowiedzi:

340

Android ma wbudowany filtr InputFilter właśnie do tego !

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

Bądź ostrożny, setFilters zresetuje wszystkie inne atrybuty , które zostały określone przez XML (czyli maxLines, inputType, imeOptinos...). Aby temu zapobiec, dodaj swoje filtry do już istniejących.

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
źródło
3
Tak! To najlepsza odpowiedź! Kod powinien być edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});jednak.
Arthur
4
OK, mieliście rację, zaktualizowałem moją odpowiedź. Dzięki za pomoc w ulepszaniu tego !!
ErlVolton
4
Aby uniknąć nadrzędnymi filtry ustawione na XML (dla np. maxLength), Starają się dołączyć InputFilter.AllCaps()do editText.getFilterstablicy. Zobacz stackoverflow.com/a/18934659/3890983
tropicalfish
21
Lub po prostu w KotlinieeditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov
4
Jeszcze lepiej: editText.filters += InputFilter.AllCaps()Kotlin jest cudowny! <3
Milack27
123

Jeśli chcesz zmusić użytkownika do pisania wielkimi literami domyślnie w EditText, wystarczy dodać android:inputType="textCapCharacters". (Użytkownik nadal może ręcznie zmienić na małe litery).

Aoyama Nanami
źródło
39
nic nie stoi na przeszkodzie, aby Użytkownik wcisnął „shift” i napisał małą literę.
Fernando Leal,
Zgadzam się z Fernando, chociaż domyślnie klawiatura jest ustawiona na kapsle, ale ich nie wymaga.
pforhan
Użytkownik może użyć przycisku Shift, aby wprowadzić małą literę, jak powiedział @Fernando
Ajinkya
24

Ustaw input typena TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. keyboardPowinien szanować to.

Gabe Sechan
źródło
android: inputType = "textCapCharacters"
Parth Kapoor
18

Możesz użyć na dwa sposoby.

Pierwszy sposób:

Ustaw android:inputType="textCapSentences"w EditText.

Drugi sposób:

Kiedy użytkownik wprowadza numer, musisz użyć obserwatora tekstu i zmienić małą na wielką literę.

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
      }
    }
});  
Ostry
źródło
2
Twoje rozwiązanie nie działa, ponieważ ustawia łańcuch w odwrotnej kolejności.
co2f2e
w jaki sposób użyłeś pierwszego czy drugiego.
Harshid
Pierwsza w ogóle nie działa. Drugi sprawia, że ​​tekst jest pisany dużymi literami, ale musimy programowo ustawić kursor na końcu zdania.
co2f2e
@Kalanamith ya then what's problem
Harshid
6
Aby pierwsza opcja textCapSentences zapisywała zdania wielkimi literami, potrzebujesz textCapCharacters.
Ghoti,
13

Możesz dodać android:textAllCaps="true"właściwość do pliku xml w EditText. Spowoduje to wymuszenie wyświetlania klawiatury miękkiej w trybie wielkich liter. Wprowadzona wartość pojawi się wielkimi literami. Nie zapewni to jednak, że użytkownik będzie mógł wprowadzać tylko UpperCaseliterami. Jeśli chcą, nadal mogą wrócić do małych liter. Jeśli chcesz mieć pewność, że dane wyjściowe Edittextsą w All Caps, musisz ręcznie przekonwertować wejściowy ciąg przy użyciu toUpperCase()metody Stringclass.

Abhishek
źródło
@GustavoAlves, Czy możesz mi po prostu powiedzieć, co się stało, kiedy tego próbowałeś? Może mogę przyjrzeć się twojemu problemowi. :)
Abhishek
Cześć @Abhishek. Ustawienie właściwości niczego nie zmieniło. EditText nadal akceptuje wielkie i małe litery.
Gus Costa,
1
Tak, jeśli chcesz ograniczyć swój EditText tylko do akceptowania wielkich liter, wtedy android: inputType = "textCapCharacters" będzie właściwą opcją. Spróbuj i daj mi znać. ☺️
Abhishek,
1
Spowodowało to wyjątek poza zakresem indeksowania, gdy każdy wpisałem.
Zapnologica
2
android:textAllCaps="true"jest tylko właściwością TextView ( stackoverflow.com/a/28803492/5268730 ). Użyj android:inputType="textCapCharacters"zamiast tego.
woodii
11

Powinieneś umieścić android:inputType="textCapCharacters"Edittext w pliku xml.

Pabel
źródło
9
AoyamaNanami napisał dokładnie tę samą odpowiedź. Skoncentruj się na bardziej aktualnych pytaniach, to jest z 2013 roku. :)
ByteHamster
2
Zauważ, że użytkownik może przesuwać i wprowadzać mniejsze znaki
Rafa0809
10

Zamiast martwić się o obsługę klawiatury, dlaczego po prostu nie zaakceptować wprowadzenia, małych lub wielkich liter i nie przekonwertować ciągu na duże?

Poniższy kod powinien pomóc:

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

Jest to przyjazne dla użytkownika, ponieważ użytkownik nie musi wiedzieć, że potrzebujesz napisu wielkimi literami. Mam nadzieję że to pomoże.

anthonycr
źródło
9

Jeszcze lepiej ... jeden liniowiec w Kotlinie ...

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

Gotowe!

S Pimenta
źródło
2
Możesz to napisać używając składni dostępu do właściwości: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan,
8
Jeszcze lepiej:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan
9

W kotlin , w pliku .kt wprowadź zmiany:

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

Użyj właściwości syntetycznej, aby uzyskać bezpośredni dostęp do widgetu o identyfikatorze. A w XML, do tekstu edycji dodaj kilka dodatkowych flag, takich jak:

<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"
    />

Spowoduje to zaktualizowanie klawiatury z włączoną obsługą wielkich liter.

Wisznu benny
źródło
8

Użyj filtra wejściowego

editText = (EditText) findViewById(R.id.enteredText);
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
Sreejesh K Nair
źródło
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());
    }
});  
Anderson Carvalho
źródło
6

Po prostu zrób to:

// ****** 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"
Pravin Suthar
źródło
5

Spróbuj użyć dowolnego z poniższych kodów, aby rozwiązać problem.

programowo:

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

XML:

android:inputType="textCapCharacters" with Edittext
Nivedh
źródło
4

U mnie zadziałało, dodając android: textAllCaps = "true" i 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"
                    />
Udara Abeythilake
źródło
3

Aby uzyskać cały kapitał, użyj w swoim kodzie XML:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>
akshay shetty
źródło
2
czy wypróbowałeś to rozwiązanie? to wyniki w wypadku zastosowania, gdy użytkownik zacząć edytować zawartość editext
surhidamatya
3

wypróbuj ten kod, a wprowadzone dane będą pisane wielkimi literami

edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});
Agil anbu
źródło
2

Na podstawie zaakceptowanej odpowiedzi ta odpowiedź robi to samo, ale w Kotlinie. Żeby ułatwić copypasting: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}
Roc Boronat
źródło
1
filters += InputFilter.AllCaps(): D
crgarridos
1

Aby uzyskać klawiaturę pisaną wielkimi literami po kliknięciu edittext, użyj tego kodu w swoim 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"
    />
Ashana.Jackol
źródło
1

Używam programu Visual Studio 2015 / Xamarin do tworzenia mojej aplikacji dla systemu Android 5.1 i Android 6.0 (ten sam plik APK jest zainstalowany na obu).

Kiedy android:inputType="textCapCharacters"podałem w moim axml, klawiatura AllCaps pojawiła się zgodnie z oczekiwaniami w systemie Android 6.0, ale nie w systemie Android 5.1. Dodałem android:textAllCaps="true"do mojego axml i nadal nie mam klawiatury AllCaps na Androidzie 5.1. EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });Ustawiłem filtr za pomocą i podczas gdy klawiatura programowa wyświetla małe litery w systemie Android 5.1, pole wprowadzania to teraz AllCaps.

EDYCJA: Różnice behawioralne, które zaobserwowałem i założyłem, że są związane z systemem operacyjnym, były w rzeczywistości spowodowane tym, że miałem różne wersje Klawiatury Google na urządzeniach testowych. Po zaktualizowaniu urządzeń do najnowszej klawiatury Google (wydanej w lipcu 2016 r. W chwili pisania tego tekstu) zachowanie „All Caps” było spójne we wszystkich systemach operacyjnych. Teraz wszystkie urządzenia wyświetlają małe litery na klawiaturze, ale wejście to wielkie litery z powoduSetFilters(new IInputFilter[] { new InputFilterAllCaps() });

Tony
źródło
1
Cześć Tony, wygląda na to, że utworzyłeś 2 konta; stackoverflow.com/users/6764633/tony-celia i stackoverflow.com/users/6771440/deeveedee . Jeśli chcesz je scalić, wejdź na stackoverflow.com/help/merging-accounts .
Matt,
Dzięki, Matt. Kreduj to do początkującej nauki / błędów. Nie pamiętałem, że utworzyłem inne konto, dopóki go nie wskazałeś. na szczęście funkcja łączenia kont była prosta. Świetne forum!
Tony
1

Xamarin odpowiednik odpowiedzi ErlVolton:

editText.SetFilters(editText.GetFilters().Append(new InputFilterAllCaps()).ToArray());
stovroz
źródło
Dlatego uwielbiam to, jak C # może być tak zwięzłe.
Lionet Chen
1

Prosta realizacja kotlina

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

PS dla mnie filtersjest zawsze początkowo pusty

Vlad
źródło
0

Jedną linią Java proponowanego rozwiązania może być:

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

Zauważ, że potrzebuje com.google.common.collect.Lists.

boriguen
źródło
-1

Po prostu dodaj poniższy kod do EditText swojego pliku xml.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

A jeśli chcesz zezwolić zarówno na wielkie litery, jak i cyfry, użyj poniższego kodu.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
Khusboo
źródło
2
To na pewno działa, ale nie jest to zbyt przyjemne doświadczenie dla użytkownika. Właśnie go wypróbowałem, a ponieważ klawiatura nie jest autokapitalizowana (przynajmniej na N), małe litery są po prostu ignorowane bez informacji zwrotnej dla użytkownika, przez co interfejs użytkownika wydaje się uszkodzony.
MattMatt
całkowicie zgadzam się z @MattMatt. Jeśli to zrobimy, użytkownik nie będzie mógł wpisywać małych liter. Użytkownik powinien móc wpisać dowolną wielkość liter, którą chce, a reszta powinna automatycznie pisać wielkimi literami
Mir Adnan