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?

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

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


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.


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

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.


@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.


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.


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!


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.


8

Użyj filtra wejściowego

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

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"

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

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

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

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

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

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

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


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

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


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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.