Définir InputType pour un EditText par programme?

216

Comment définir le type d'entrée pour un EditText par programme? J'essaie:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

cela ne semble pas avoir d'effet.

user246114
la source

Réponses:

213

Selon les documents TextView , la version programmatique d'Android: le mot de passe est setTransformationMethod () , pas setInputType (). Donc quelque chose comme:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

devrait faire l'affaire.

coquiner
la source
4
Pour ajouter à cela, vous devez appeler setTransformationMethod au lieu de setInputType. L'appel de setInputType après setTransformationMethod empêche à nouveau EditText d'être en mode mot de passe.
Paul Ryland
11
cette réponse est incorrecte pour la question posée. Cela transforme uniquement le texte entré dans EditText(remplace les caractères par des points de mot de passe). Cela n'a aucun effet sur ce qui est autorisé à être inscrit en EditTextsoi.
slinden77
4
setInputType appelle finalement setTransformationMethod de l'intérieur, donc si vous passez le TYPE_TEXT_VARIATION_PASSWORD à setInputType, il le fera pour vous. Le problème semble résider dans l'appel à setSingleLine après avoir appelé setInputType qui appellera setTransformationMethod avec null ou le transformateur à ligne unique, effaçant ainsi le transformateur de mot de passe.
sparkym3
après l'appel setTransformationMethod (PasswordTransformationMethod.getInstance ()) je ne peux pas le modifier
sujith s
mais le mot de passe apparaîtra dans le texte suggéré la prochaine fois que le champ sera utilisé
Gary Davies
409

Pour définir le type d'entrée pour un EditText par programme, vous devez spécifier que le type de classe d'entrée est du texte.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Amitku
la source
2
Votre astuce a parfaitement fonctionné pour moi! J'ai eu un problème similaire avec la définition par programme du type d'entrée sur multiligne.
Anna Lam
Quelle est l'importance d'avoir un opérateur OR au niveau du bit ici? Désolé, je suis nouveau sur Android.
sanjeev
Je ne suis pas d'accord InputType.TYPE_TEXT_VARIATION_PASSWORD ne fonctionne pas pour moi mais setTransformationMethod (PasswordTransformationMethod.getInstance ()); Est-ce que !
Lluis Felisart
38

Voici les différents types d'entrée comme indiqué sur le clavier standard.

démo des types d'entrée

Définition du type d'entrée par programme

editText.setInputType(InputType.TYPE_CLASS_TEXT);

En plus, vous TYPE_CLASS_TEXTtrouverez d' autres options dans la documentation .

Définition du type d'entrée en XML

<EditText
    android:inputType="text"
/>

En plus, vous texttrouverez d' autres options dans la documentation .

Code supplémentaire

Voici le code de l'image ci-dessus.

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

Voir également

Suragch
la source
29

j'ai tout résolu avec

.setInputType(InputType.TYPE_CLASS_NUMBER);

pour voir des données claires et

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

pour voir les points (si les données sont un nombre, ce n'est pas le choix de l'autre classe)

radin
la source
Cela a fonctionné, merci! Une question: pourquoi dois-je ajouter «ou» lors du passage du texte brut au type de mot de passe? Pourquoi ne puis-je pas simplement faire ceci: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? J'ai essayé et ça n'a pas marché.
UnknownUser
15

Pour autoriser uniquement les nombres:

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

Pour transformer (masquer) le mot de passe:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());
slinden77
la source
7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// vous pouvez changer le TYPE _... selon vos besoins.

Ajeet
la source
5

Pour Kotlin:

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

Cela peut être utile à d'autres comme moi qui souhaitaient basculer entre le mot de passe et le mode texte libre. J'ai essayé d'utiliser les méthodes de saisie suggérées, mais cela n'a fonctionné que dans une seule direction. Je pouvais passer du mot de passe au texte, mais je ne pouvais pas revenir en arrière. Pour ceux qui essaient de gérer une bascule (par exemple une case à cocher afficher le mot de passe), utilisez

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

Je dois créditer cela pour la solution. J'aimerais avoir trouvé ça il y a quelques heures!

Brian Reinhold
la source
1

Pour afficher le mot de passe:

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

Pour masquer à nouveau le mot de passe:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
Alif
la source
0

Essayez d'ajouter ceci à la balise EditText / TextView dans votre mise en page

android:password="true"

Edit: Je viens de relire votre message, peut-être que vous devez le faire après la construction. Je ne vois pas pourquoi votre extrait de code ne fonctionnerait pas.

Jim Blackler
la source
Je n'ai pas de fichier de mise en page dans ce cas, les champs sont générés par programmation.
user246114
Oui, cela se fait après la construction, je ne sais pas pourquoi cela ne fonctionne pas non plus!
user246114
6
cette option est maintenant obsolète !!
swiftBoy
cette chose n'est que celle qui fonctionne pour l'ancien Android 2.3, j'ai voté pour la réponse.
djdance
0

Je sais que la réponse attendue est arrivée Java. Mais voici mes 2 cents de conseils, essayez toujours de gérer les choses liées à la vue XML(au moins les choses de base), donc je suggérerais plutôt d'utiliser un xmlattribut plutôt que de gérer ce cas d'utilisation dansjava

    <EditText
     android:inputType="textPassword"/>
pratham kesarkar
la source
2
Dans certains cas, vous souhaiterez peut-être basculer entre différents types d'entrée, par exemple masquer / afficher le mot de passe entré dans un champ; c'est ce qui m'a laissé sur cette page
William
1
mais pour cela, il y a une option dans EditText qui vous permet d'afficher / masquer le mot de passe, pas besoin de le faire vous-même, cela donne une belle animation pour cela.
pratham kesarkar
merci pour l'info, je l'ai vu ici stackoverflow.com/a/41163578/3310235
William
0

Cacher:

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

Spectacle:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
miragessee
la source
0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

vous devez également veiller à ce que le curseur se déplace vers le point de départ de editText après l'appel de cette fonction, assurez-vous donc de déplacer à nouveau le curseur vers le point de fin.

Vibhanshu Sharma
la source
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
Sailokesh Aithagoni
la source