Définir InputType pour un EditText par programme?


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.


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

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


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)


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

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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


5

Pour Kotlin:

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

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!


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

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.


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

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

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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.