Impostare inputType per un EditText a livello di codice?


216

Come impostiamo il tipo di input per un EditText a livello di codice? Sto provando:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

non sembra avere alcun effetto.

Risposte:


213

Secondo i documenti TextView , la versione programmatica di android: password è setTransformationMethod () , non setInputType (). Quindi qualcosa come:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

dovrebbe fare il trucco.


4
Solo per aggiungere a questo, è necessario chiamare setTransformationMethod invece di setInputType. La chiamata di setInputType dopo setTransformationMethod fa sì che EditText non sia più in modalità password.
Paul Ryland,

11
questa risposta è errata per la domanda che viene posta. Questo trasforma solo il testo inserito in EditText(sostituisce i caratteri con punti password). Ciò non ha alcun effetto su ciò che può essere inserito in EditTextse stesso.
slinden77,

4
setInputType alla fine chiama setTransformationMethod dall'interno, quindi se passi TYPE_TEXT_VARIATION_PASSWORD a setInputType lo farà per te. Il problema sembra risiedere nel chiamare setSingleLine dopo aver chiamato setInputType che chiamerà setTransformationMethod con null o il trasformatore a linea singola cancellando così il trasformatore di password.
sparkym3

after call setTransformationMethod (PasswordTransformationMethod.getInstance ()) non riesco a modificarlo
sujith s

ma la password apparirà nel testo suggerito la prossima volta che il campo verrà utilizzato
Gary Davies,

409

Per impostare il tipo di input per un EditText a livello di codice, è necessario specificare che il tipo di classe di input è il testo.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

2
Il tuo consiglio ha funzionato perfettamente per me! Ho avuto un problema simile con l'impostazione a livello di codice del tipo di input su multilinea.
Anna Lam,

Qual è il significato di avere un operatore OR bit a bit qui? Mi dispiace, sono nuovo per Android.
sanjeev,

Non sono d'accordo InputType.TYPE_TEXT_VARIATION_PASSWORD non funziona per me ma setTransformationMethod (PasswordTransformationMethod.getInstance ()); fa!
Lluis Felisart,

38

Ecco i vari tipi di input come mostrato sulla tastiera standard.

tipi di input demo

Impostazione del tipo di input a livello di codice

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Altre opzioni oltre TYPE_CLASS_TEXTpossono essere trovate nella documentazione .

Impostazione del tipo di input in XML

<EditText
    android:inputType="text"
/>

Altre opzioni oltre textpossono essere trovate nella documentazione .

Codice supplementare

Ecco il codice per l'immagine qui sopra.

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

Guarda anche


29

ho risolto tutto con

.setInputType(InputType.TYPE_CLASS_NUMBER);

per vedere dati chiari e

.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

per vedere i punti (se i dati sono un numero, non è una scelta che altra classe)


Questo ha funzionato, grazie! Una domanda, perché devo aggiungere "o" quando si passa dal testo normale al tipo di password? Perché non posso semplicemente fare questo: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Ho provato e non ha funzionato.
UnknownUser

15

Per consentire solo numeri:

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

Per trasformare (nascondere) la password:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// puoi cambiare TIPO _... in base alle tue esigenze.


5

Per Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"

4

Questo può essere di aiuto per altri come me che volevano alternare tra la modalità password e testo libero. Ho provato a utilizzare i metodi di input suggeriti, ma ha funzionato solo in una direzione. Potrei passare dalla password al testo ma non potrei più tornare indietro. Per coloro che cercano di gestire un interruttore (ad esempio una casella di controllo Mostra password) utilizzare

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

Devo dare credito a questo per la soluzione. Vorrei averlo scoperto poche ore fa!


1

Per scoprire la password:

editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

Per nascondere nuovamente la password:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

Prova ad aggiungere questo al tag EditText / TextView nel tuo layout

android:password="true"

Modifica: ho appena riletto il tuo post, forse devi farlo dopo la costruzione. Non vedo perché il tuo frammento non funzioni.


Non ho un file di layout in questo caso, i campi vengono generati in modo programmatico.
user246114

Sì, è stato fatto dopo la costruzione, non so nemmeno perché non funzioni!
user246114

6
questa opzione ora è obsoleta !!
swiftBoy,

questa cosa è solo una che funziona per il vecchio Android 2.3, ho votato a favore della risposta.
djdance,

0

So che la risposta prevista è in Java. Ma ecco i miei 2 centesimi di consiglio provano sempre a gestire le cose correlate in XML(almeno roba di base), quindi suggerirei piuttosto di usare un xmlattributo piuttosto che gestire questo caso d'uso injava

    <EditText
     android:inputType="textPassword"/>

2
In alcuni casi potresti voler alternare tra diversi tipi di input, ad esempio nascondere / mostrare la password inserita in un campo; che è ciò che mi ha permesso di accedere a questa pagina
William,

1
ma per questo c'è un'opzione in EditText che ti consente di mostrare / nascondere la password non è necessario farlo da soli e dà anche una bella animazione per quello.
Pratham kesarkar,

grazie per le informazioni, l'ho visto qui stackoverflow.com/a/41163578/3310235
William

0

Nascondere:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

Mostrare:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());

0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

inoltre, è necessario fare attenzione che il cursore si sposta sul punto iniziale di editText dopo aver chiamato questa funzione, quindi assicurarsi di spostare nuovamente il cursore sul punto finale.


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.