In Android EditText, come forzare la scrittura in maiuscolo?


144

Nella mia applicazione Android ho diversi punti in EditTextcui l'utente può inserire informazioni. Ma devo forzare l'utente a scrivere in lettere maiuscole. Conosci una funzione per farlo?

Risposte:


340

Android in realtà ha un InputFilter incorporato proprio per questo !

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

Attenzione, setFilters si ripristinano tutti gli altri attributi che sono stati impostati tramite XML (cioè maxLines, inputType, imeOptinos...). Per evitarlo, aggiungi i filtri a quelli già esistenti.

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
Sì! Questa è la risposta migliore! Il codice dovrebbe essere edittext.setFilters(new InputFilter[] {new InputFilter.AllCaps()});però.
Arthur,

4
OK, avete ragione, ho aggiornato la mia risposta. Grazie per aver contribuito a migliorare questo !!
ErlVolton,

4
Per evitare sovrascrivendo i filtri impostati su XML (per es. maxLength), Cercano di appendere l' InputFilter.AllCaps()ad editText.getFiltersarray. Vedi stackoverflow.com/a/18934659/3890983
tropicali

21
O solo a KotlineditText.filters = editText.filters + InputFilter.AllCaps()
Ilia Kurtov,

4
Meglio ancora: editText.filters += InputFilter.AllCaps()Kotlin è meraviglioso! <3
Milack27

123

Se vuoi forzare l'utente a scrivere in lettere maiuscole per impostazione predefinita nel tuo EditText, devi solo aggiungere android:inputType="textCapCharacters". (L'utente può ancora passare manualmente in minuscolo).


39
nulla impedisce all'utente di premere "maiusc" e scrivere una lettera minuscola.
Fernando Leal,

Concordo con Fernando, mentre per impostazione predefinita la tastiera è maiuscola, non li richiede.
pforhan,

L'utente può utilizzare il pulsante MAIUSC per inserire una minuscola, come indicato da @Fernando
Ajinkya,

24

Impostare input typesu TYPE_CLASS_TEXT| TYPE_TEXT_FLAG_CAP_CHARACTERS. L' keyboarddovrebbe onorare tale.


android: inputType = "textCapCharacters"
Parth Kapoor

18

Puoi usarlo in due modi.

Primo modo:

Imposta android:inputType="textCapSentences"sul tuo EditText.

Secondo modo:

Quando l'utente immette il numero, è necessario utilizzare l'osservatore di testo e passare da piccolo a maiuscolo.

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
la tua soluzione non funziona perché imposta la stringa su un ordine inverso.
co2f2e,

in che modo hai usato il primo o il secondo.
Harshid,

Il primo non funziona affatto. Il secondo rende il testo in maiuscolo ma dobbiamo programmare il cursore alla fine della frase in modo programmatico.
co2f2e

@Kalanamith ya quindi qual è il problema
Harshid,

6
Per la prima opzione textCapSentences capitalizza le frasi, hai bisogno di textCapCharacters.
Ghoti,

13

È possibile aggiungere la android:textAllCaps="true"proprietà al file XML nel EditText. Ciò imporrà che la tastiera dell'ingresso soft appaia in modalità tutto maiuscolo. Il valore inserito apparirà in maiuscolo. Tuttavia, ciò non garantirà che l'utente possa inserire solo UpperCaselettere. Se lo desiderano, possono ancora ricorrere alle lettere minuscole. Se vuoi assicurarti che l'output di Edittextsia in Tutte le maiuscole, devi convertire manualmente la stringa di input usando il toUpperCase()metodo della Stringclasse.


@GustavoAlves, puoi dirmi cosa è successo quando hai provato questo? Forse posso esaminare il tuo problema. :)
Abhishek,

Ciao @Abhishek. L'impostazione della proprietà non ha cambiato nulla. EditText accetta ancora caratteri sia maiuscoli che minuscoli.
Gus Costa,

1
Sì, se vuoi limitare il tuo EditText solo per accettare i caratteri maiuscoli, allora per te, android: inputType = "textCapCharacters" sarebbe l'opzione giusta. Provalo e fammi sapere. ☺️
Abhishek,

1
Ciò causava e indicizzava fuori dai limiti l'eccezione ogni volta che scrivevo.
Zapnologica,

2
android:textAllCaps="true"è solo una proprietà di TextView ( stackoverflow.com/a/28803492/5268730 ). Usa android:inputType="textCapCharacters"invece.
woodii,

11

Dovresti metterlo android:inputType="textCapCharacters"con Edittext nel file xml.


9
AoyamaNanami ha scritto esattamente la stessa risposta. Concentrati sulle domande più attuali, questa è del 2013. :)
ByteHamster

2
Si noti che l'utente può spostare e inserire caratteri inferiori
Rafa0809,

10

Piuttosto che preoccuparsi di gestire la tastiera, perché non accettare qualsiasi input, minuscolo o maiuscolo e convertire la stringa in maiuscolo?

Il seguente codice dovrebbe aiutare:

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

Questo è intuitivo poiché non è necessario che l'utente sappia che è necessaria la stringa in maiuscolo. Spero che questo ti aiuti.


9

Ancora meglio ... una fodera a Kotlin ...

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

Fatto!


2
Puoi scriverlo usando la sintassi di accesso alla proprietà: <your_edit_text>.filters = <your_edit_text>.filters + InputFilter.AllCaps()
Makotosan,

8
Meglio ancora:<your_edit_text>.filters += InputFilter.AllCaps()
Makotosan il

9

In kotlin , nel file .kt apporta le modifiche:

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

Utilizzare la proprietà sintetica per l'accesso diretto al widget con ID. E in XML, per il tuo testo di modifica aggiungi un paio di più flag come:

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

Ciò aggiornerà la tastiera come maiuscola abilitata.


8

Usa il filtro di input

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

Basta fare questo:

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

Prova a utilizzare uno dei seguenti codici per risolvere il problema.

programatically:

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

XML:

android:inputType="textCapCharacters" with Edittext

4

Per me ha funzionato aggiungendo android: textAllCaps = "true" e 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

Per ottenere tutto il capitale, utilizzare quanto segue nel proprio XML:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAllCaps="true"
    android:inputType="textCapCharacters"
/>

2
hai provato questa soluzione? ciò provoca un arresto anomalo dell'applicazione quando l'utente inizia a modificare il contenuto di editext
surhidamatya,

3

prova questo codice renderà il tuo input in maiuscolo

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

2

Basato sulla risposta accettata, questa risposta fa lo stesso, ma in Kotlin. Solo per facilitare il copypasting: ·)

private fun EditText.autocapitalize() {
    val allCapsFilter = InputFilter.AllCaps()
    setFilters(getFilters() + allCapsFilter)
}

1
filters += InputFilter.AllCaps(): D
crgarridos,

1

Per ottenere la tastiera maiuscola quando fai clic su edittext usa questo codice nel tuo 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

Sto usando Visual Studio 2015 / Xamarin per creare la mia app sia per Android 5.1 che per Android 6.0 (lo stesso apk installato su entrambi).

Quando ho specificato android:inputType="textCapCharacters"nel mio axml, la tastiera AllCaps è apparsa come previsto su Android 6.0, ma non su Android 5.1. Ho aggiunto android:textAllCaps="true"al mio axml e ancora nessuna tastiera AllCaps su Android 5.1. Ho impostato un filtro usando EditText.SetFilters(new IInputFilter[] { new InputFilterAllCaps() });e mentre la tastiera virtuale mostra caratteri minuscoli su Android 5.1, il campo di input ora è AllCaps.

EDIT: Le differenze comportamentali che ho osservato e presunto fossero legate al sistema operativo erano in realtà perché avevo diverse versioni di Google Keyboard sui dispositivi di test. Dopo aver aggiornato i dispositivi con l'ultima tastiera Google (rilasciata a luglio 2016 al momento della stesura di questo documento), il comportamento di "Tutte maiuscole" era coerente tra i sistemi operativi. Ora, tutti i dispositivi mostrano caratteri minuscoli sulla tastiera, ma l'input è Tutte maiuscole a causa diSetFilters(new IInputFilter[] { new InputFilterAllCaps() });


1
Ciao Tony, sembra che tu abbia creato 2 account; stackoverflow.com/users/6764633/tony-celia e stackoverflow.com/users/6771440/deeveedee . Se desideri unirli, consulta stackoverflow.com/help/merging-accounts .
Matt,

Grazie Matt. Calcola questo fino all'apprendimento / agli errori per principianti. Non ricordo che avevo creato un altro account fino a quando non lo hai indicato. fortunatamente, la funzione di unione dell'account era semplice. Ottimo forum!
Tony

1

Equivalente Xamarin della risposta di ErlVolton:

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

Questo è il motivo per cui adoro come C # possa essere così conciso.
Lionet Chen,

1

Semplice realizzazione di kotlin

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

PS per me filtersè sempre vuoto inizialmente


0

Un Java 1-liner della soluzione proposta potrebbe essere:

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

Nota che ha bisogno com.google.common.collect.Lists.


-1

Semplicemente, aggiungi il codice seguente al tuo EditText del tuo file xml.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

E se si desidera consentire sia il testo in maiuscolo che le cifre, utilizzare il codice seguente.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"

2
Funziona di sicuro, ma non è una bella esperienza utente. L'ho appena provato e poiché la tastiera non si autocapitalizza (almeno su N), i caratteri digitati in minuscolo vengono semplicemente ignorati senza alcun feedback per l'utente, rendendo l'interfaccia utente non funzionante.
MattMatt,

completamente d'accordo con @MattMatt. Se lo facciamo, l'utente non sarà in grado di digitare lettere minuscole. L'utente dovrebbe essere in grado di digitare qualsiasi caso voglia e il resto dovrebbe mettere in maiuscolo le parole
Mir Adnan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.