web-dev-qa-db-fra.com

Comment basculer entre masquer et afficher le mot de passe

Existe-t-il un moyen astucieux de laisser l'utilisateur basculer entre masquer et afficher le mot de passe dans Android EditText? Un certain nombre d'applications pour PC le permettent.

124
jacknad

Vous pouvez modifier dynamiquement les attributs d'un TextView. Si vous définissez XML Atrribute Android:password sur true, la vue affichera des points si vous la définissez sur false, le texte est affiché. 

Avec la méthode setTransformationMethod , vous devriez pouvoir modifier ces attributs à partir de code. (Avertissement: je n'ai pas vérifié si la méthode fonctionnait toujours après l'affichage de la vue. Si vous rencontrez des problèmes, laissez-moi un commentaire.) 

Le code de l'échantillon complet serait 

yourTextView.setTransformationMethod(new PasswordTransformationMethod());

cacher le mot de passe. Pour afficher le mot de passe, vous pouvez définir l'une des méthodes de transformation existantes ou implémenter un TransformationMethod vide qui ne fait rien avec le texte saisi.

yourTextView.setTransformationMethod(new DoNothingTransformation());
119
Janusz

C'est vraiment facile à réaliser depuis la bibliothèque de support v24.2.0.

Ce que vous devez faire c'est juste:

  1. Ajoutez la bibliothèque de conception à vos dépendances

    dependencies {
         compile "com.Android.support:design:24.2.0"
    }
    
  2. Utilisez TextInputEditText avec TextInputLayout

    <Android.support.design.widget.TextInputLayout
        Android:id="@+id/etPasswordLayout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:passwordToggleEnabled="true"
        Android:layout_marginBottom="@dimen/login_spacing_bottom">
    
        <Android.support.design.widget.TextInputEditText
            Android:id="@+id/etPassword"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:hint="@string/fragment_login_password_hint"
            Android:inputType="textPassword"/>
    </Android.support.design.widget.TextInputLayout>
    

L'attribut passwordToggleEnabled fera l'affaire!

  1. Dans votre mise en page racine, n'oubliez pas d'ajouter xmlns:app="http://schemas.Android.com/apk/res-auto" 

  2. Vous pouvez personnaliser votre bascule de mot de passe en utilisant:

app:passwordToggleDrawable - Peut être utilisé comme icône de bascule de visibilité de saisie du mot de passe.
app:passwordToggleTint - Icône à utiliser pour le basculement de visibilité de saisie du mot de passe.
app:passwordToggleTintMode - Mode de fusion utilisé pour appliquer la teinte de fond.

Plus de détails dans Documentation TextInputLayout .

 enter image description here

223
mmBs

Pour afficher les points au lieu du mot de passe, définissez le PasswordTransformationMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod());

bien sûr, vous pouvez définir cela par défaut dans votre élément edittext dans la mise en page XML avec

Android:password

Pour afficher à nouveau le mot de passe lisible, il suffit de passer null comme méthode de transformation:

yourEditText.setTransformationMethod(null);
98
Qlimax

Montrer:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Cacher:

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

Après chacun de ceux-ci, le curseur est réinitialisé, ainsi:

editText.setSelection(editText.length());
71
Matt Logan

Vous pouvez utiliserapp:passwordToggleEnabled="true"

voici l'exemple donné ci-dessous

<Android.support.design.widget.TextInputLayout
        Android:id="@+id/password"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:passwordToggleEnabled="true"
        Android:textColorHint="@color/colorhint"
        Android:textColor="@color/colortext">
22
Tabish khan

Utilisez la case à cocher et modifiez le type de saisie en conséquence.

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    int start,end;
    Log.i("inside checkbox chnge",""+isChecked);
    if(!isChecked){
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(new PasswordTransformationMethod());;
        passWordEditText.setSelection(start,end);
    }else{
        start=passWordEditText.getSelectionStart();
        end=passWordEditText.getSelectionEnd();
        passWordEditText.setTransformationMethod(null);
        passWordEditText.setSelection(start,end);
    }
}
10
Praveena

C'est un travail pour moi. Cela vous aidera certainement  

showpass.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(!isChecked){

                    // show password
                    password_login.setTransformationMethod(PasswordTransformationMethod.getInstance());

                    Log.i("checker", "true");
                }

                else{
                    Log.i("checker", "false");

                     // hide password
    password_login.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }

            }
        });
6
sujith s
private boolean isPasswordVisible;

private TextInputEditText firstEditText;

...

firstEditText = findViewById(R.id.et_first);

...

    private void togglePassVisability() {
    if (isPasswordVisible) {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());           
    } else {
        String pass = firstEditText.getText().toString();
        firstEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        firstEditText.setInputType(InputType.TYPE_CLASS_TEXT);
        firstEditText.setText(pass);
        firstEditText.setSelection(pass.length());
    }
    isPasswordVisible= !isPasswordVisible;
}
5
private int passwordNotVisible=1; 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
 showPassword = (ImageView) findViewById(R.id.show_password);
    showPassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText paswword = (EditText) findViewById(R.id.Password);
            if (passwordNotVisible == 1) {
                paswword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                passwordNotVisible = 0;
            } else {

                paswword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                passwordNotVisible = 1;
            }


            paswword.setSelection(paswword.length());

        }
    });
}
4
Shailesh Bhardwaj

Je sens que je veux répondre à cette question même là quelques bonnes réponses, 

selon documentation TransformationMethod faisons notre mission

Méthode de transformation

TextView utilise TransformationMethods pour remplacer, par exemple, le caractères des mots de passe avec des points, ou en conservant les caractères de nouvelle ligne causant des sauts de ligne dans les champs de texte d’une seule ligne.

Avis J'utilise un couteau à beurre, mais c'est la même chose si l'utilisateur vérifie le mot de passe 

@OnCheckedChanged(R.id.showpass)
    public void onChecked(boolean checked){
        if(checked){
            et_password.setTransformationMethod(null);
        }else {
            et_password.setTransformationMethod(new PasswordTransformationMethod());

        }
       // cursor reset his position so we need set position to the end of text
        et_password.setSelection(et_password.getText().length());
    }
4
Mina Fawzy

Je peux ajouter le code ShowPassword/HidePassword avec seulement quelques lignes, contenues dans un bloc:

protected void onCreate(Bundle savedInstanceState) {
    ...
    etPassword = (EditText)findViewById(R.id.password);
    etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password initially

    checkBoxShowPwd = (CheckBox)findViewById(R.id.checkBoxShowPwd);
    checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Hide initially, but prompting "Show Password"
    checkBoxShowPwd.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
            if (isChecked) {
                etPassword.setTransformationMethod(null); // Show password when box checked
                checkBoxShowPwd.setText(getString(R.string.label_hide_password)); // Prompting "Hide Password"
            } else {
                etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password when box not checked
                checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Prompting "Show Password"
            }
        }
    } );
    ...
4
david m lee

Vous pouvez AFFICHER/MASQUER le mot de passe en utilisant le code ci-dessous:

CODE XML:

<EditText
        Android:id="@+id/etPassword"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginLeft="21dp"
        Android:layout_marginTop="14dp"
        Android:ems="10"
        Android:inputType="textPassword" >
        <requestFocus />
    </EditText>
    <CheckBox
        Android:id="@+id/cbShowPwd"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignLeft="@+id/etPassword"
        Android:layout_below="@+id/etPassword"
        Android:text="@string/show_pwd" />

Java CODE:

EditText mEtPwd;
CheckBox mCbShowPwd;


mEtPwd = (EditText) findViewById(R.id.etPassword);
mCbShowPwd = (CheckBox) findViewById(R.id.cbShowPwd);

mCbShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        // checkbox status is changed from uncheck to checked.
        if (!isChecked) {
            // show password
            mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
        } else {
            // hide password
            mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        }
    }
});
3

afficher et masquer le mot de passe Edit_Text avec case à cocher

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <EditText
        Android:inputType="textPassword"
        Android:id="@+id/edtPass"
        Android:textSize="20dp"
        Android:hint="password"
        Android:padding="20dp"
        Android:background="#efeaea"
        Android:layout_width="match_parent"
        Android:layout_margin="20dp"
        Android:layout_height="wrap_content" />

    <CheckBox
        Android:background="#ff4"
        Android:layout_centerInParent="true"
        Android:textSize="25dp"
        Android:text="show password"
        Android:layout_below="@id/edtPass"
        Android:id="@+id/showPassword"
        Android:layout_marginTop="20dp"
        Android:layout_width="wrap_content"
        Android:gravity="top|right"
        Android:layout_height="wrap_content" />

</RelativeLayout>

Code Java

package com.example.root.sql2;

import Android.annotation.SuppressLint;
import Android.os.Bundle;
import Android.support.design.widget.FloatingActionButton;
import Android.support.design.widget.Snackbar;
import Android.support.v7.app.AppCompatActivity;
import Android.support.v7.widget.AppCompatCheckBox;
import Android.support.v7.widget.Toolbar;
import Android.text.method.HideReturnsTransformationMethod;
import Android.text.method.PasswordTransformationMethod;
import Android.view.View;
import Android.widget.CheckBox;
import Android.widget.CompoundButton;
import Android.widget.EditText;

public class password extends AppCompatActivity {


    EditText password;
    CheckBox show_hide_password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hide);
        findViewById();
        show_hide_pass();



    }//end onCreate



    public void show_hide_pass(){
        show_hide_password.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (!b){
                    // hide password
                    password.setTransformationMethod(PasswordTransformationMethod.getInstance());

                }else{
                    // show password
                    password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });
    } // end show_hide_pass




    public void findViewById(){ //  find ids ui and
        password = (EditText) findViewById(R.id.edtPass);
        show_hide_password = (CheckBox) findViewById(R.id.showPassword);
    }//end findViewById



}// end class
2
oktay

Essayez https://github.com/maksim88/PasswordEditText project sur github . Vous n’avez même pas besoin de changer votre code Java en l’utilisant. Il suffit de changer

Éditer le texte

tag à

com.maksim88.passwordedittext.PasswordEditText

dans votre fichier XML. 

2
Anatoliy Shuba

Avez-vous essayé avec setTransformationMethod? Il est hérité de TextView et veut un TransformationMethod en tant que paramètre.

Vous pouvez en savoir plus sur TransformationMethods ici .

Il a également quelques fonctionnalités intéressantes, comme le remplacement de personnage.

2
Hamcha

Voici ma solution sans utiliser TextInputEditText et la méthode de transformation.

XML

<LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

        <TextView
            style="@style/FormLabel"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:text="@string/username" />

        <EditText
            Android:id="@+id/loginUsername"
            style="@style/EditTextStyle"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:drawableLeft="@drawable/ic_person_outline_black_24dp"
            Android:drawableStart="@drawable/ic_person_outline_black_24dp"
            Android:inputType="textEmailAddress"
            Android:textColor="@color/black" />

        <TextView
            style="@style/FormLabel"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="20dp"
            Android:text="@string/password" />

        <EditText
            Android:id="@+id/loginPassword"
            style="@style/EditTextStyle"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:drawableEnd="@drawable/ic_visibility_off_black_24dp"
            Android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
            Android:drawableRight="@drawable/ic_visibility_off_black_24dp"
            Android:drawableStart="@drawable/ic_lock_outline_black_24dp"
            Android:inputType="textPassword"
            Android:textColor="@color/black" />
    </LinearLayout>

Java Code

boolean VISIBLE_PASSWORD = false;  //declare as global variable befor onCreate() 
loginPassword = (EditText)findViewById(R.id.loginPassword);
loginPassword.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            final int DRAWABLE_LEFT = 0;
            final int DRAWABLE_TOP = 1;
            final int DRAWABLE_RIGHT = 2;
            final int DRAWABLE_BOTTOM = 3;

            if (event.getAction() == MotionEvent.ACTION_UP) {
                if (event.getRawX() >= (loginPassword.getRight() - loginPassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
                    // your action here
                    //Helper.toast(LoginActivity.this, "Toggle visibility");
                    if (VISIBLE_PASSWORD) {
                        VISIBLE_PASSWORD = false;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_off_black_24dp, 0);
                    } else {
                        VISIBLE_PASSWORD = true;
                        loginPassword.setInputType(InputType.TYPE_CLASS_TEXT);
                        loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_black_24dp, 0);
                    }
                    return false;
                }
            }
            return false;
        }
    });
1
Sagar Chapagain

Sous forme très simple:

private fun updatePasswordVisibility(editText: AppCompatEditText) {
        if (editText.transformationMethod is PasswordTransformationMethod) {
            editText.transformationMethod = null
        } else {
            editText.transformationMethod = PasswordTransformationMethod()
        }
        editText.setSelection(editText.length())
    }

J'espère que ça aide.

1
Hiren Patel

Ce que j'ai fait était de 

  1. Créer une vue d'édition de texte et une vue de texte normale
  2. Faites en sorte qu'ils se chevauchent en utilisant la disposition des contraintes (tout comme l'écran de connexion de l'application Facebook)
  3. Attachez un onClickListener à la vue de texte normale afin qu'elle modifie le type de saisie de la vue de texte modifié en conséquence (Visible/Non visible)

Vous pouvez visionner cette vidéo pour une explication plus détaillée/ https://youtu.be/md3eVaRzdIM

J'espère que ça aide :)

1
Jack

Mon extension Kotlin. écrire une fois utiliser partout

fun EditText.tooglePassWord() {
this.tag = !((this.tag ?: false) as Boolean)
this.inputType = if (this.tag as Boolean)
    InputType.TYPE_TEXT_VARIATION_PASSWORD
else
    (InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD)

this.setSelection(this.length()) }

Vous pouvez conserver cette méthode dans n’importe quel fichier et l’utiliser partout. Utilisez-la comme ceci

ivShowPassword.click { etPassword.tooglePassWord() }

où ivShowPassword est cliqué sur imageview (eye) et etPassword est Editext

0
Aklesh Singh

Une bonne solution Configurez un bouton, puis utilisez ce code:

public void showPassword(View v)
{

    TextView showHideBtnText = (TextView) findViewById(R.id.textView1);

    if(showHideBtnText.getText().toString().equals("Show Password")){
        password.setTransformationMethod(null);
        showHideBtnText.setText("Hide");
    } else{
        password.setTransformationMethod(new PasswordTransformationMethod());
        showHideBtnText.setText("Show Password");
    }


}
0
matthewoak

Selon cette source , si vous avez migré votre projet vers AndroidX, vous pouvez alors remplacer

compile "com.Android.support:design:24.2.0"

avec

implementation "com.google.Android.material:material:1.0.0"

Ensuite, tout ce que vous avez à faire est de mettre le code ci-dessous dans votre fichier de mise en page:

<com.google.Android.material.textfield.TextInputLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:passwordToggleEnabled="true"
    Android:hint="@string/hint_text">

  <com.google.Android.material.textfield.TextInputEditText
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"/>

</com.google.Android.material.textfield.TextInputLayout>

Plus d'informations sur le matériau TextInputLayout peuvent être trouvées ici .

À cette source , il est recommandé de migrer vers AndroidX à partir de Android Bibliothèque de support:

AndroidX est le projet open-source utilisé par l'équipe Android pour développer, tester, créer des packages, créer et gérer des bibliothèques dans Jetpack.

AndroidX est une amélioration majeure de la bibliothèque de support Android d'origine. À l'instar de la bibliothèque de support, AndroidX est livré séparément du système d'exploitation Android et offre une compatibilité ascendante entre les versions de Android. AndroidX remplace totalement la bibliothèque de support en fournissant une parité des fonctionnalités et de nouvelles bibliothèques. De plus, AndroidX inclut les fonctionnalités suivantes:

Tous les packages sous AndroidX résident dans un espace de noms cohérent commençant par la chaîne androidx. Les packages de la bibliothèque de support ont été mappés dans les packages androidx. * Correspondants. Pour un mappage complet de toutes les anciennes classes et créer des artefacts pour les nouveaux, voir la page Refactoring de paquet.

Contrairement à la bibliothèque de support, les packages AndroidX sont gérés et mis à jour séparément. Les packages androidx utilisent la version sémantique stricte à partir de la version 1.0.0. Vous pouvez mettre à jour les bibliothèques AndroidX de votre projet indépendamment.

Tous les nouveaux développements de la bibliothèque de support auront lieu dans la bibliothèque AndroidX. Cela inclut la maintenance des artefacts de la bibliothèque de support d'origine et l'introduction de nouveaux composants Jetpack.

0
emiraslan

compiler 'com.Android.support:appcompat-v7:24.2.0'

compiler 'com.Android.support:design:24.2.0'

dans la mise en page

    Android:inputType="textPassword"

Ça marche

0
Keshav Gera

En XML faire comme ça 

    <LinearLayout
          Android:layout_height="wrap_content"
          Android:layout_width="fill_parent"
          Android:orientation="vertical"
          >
          <RelativeLayout
              Android:id="@+id/REFReLayTellFriend"
              Android:layout_width="match_parent"
              Android:layout_height="wrap_content"
              Android:orientation="horizontal"
              >
          <EditText
              Android:id="@+id/etpass1"
              Android:layout_width="fill_parent"
              Android:layout_height="wrap_content"
              Android:background="@Android:color/transparent"
              Android:bottomLeftRadius="10dp"
              Android:bottomRightRadius="50dp"
              Android:fontFamily="@font/frutiger"
              Android:gravity="start"
              Android:inputType="textPassword"
              Android:hint="@string/regpass_pass1"
              Android:padding="20dp"
              Android:paddingBottom="10dp"
              Android:textColor="#000000"
              Android:textColorHint="#d3d3d3"
              Android:textSize="14sp"
              Android:topLeftRadius="10dp"
              Android:topRightRadius="10dp"/>
              <ImageButton
                  Android:id="@+id/imgshowhide1"
                  Android:layout_width="40dp"
                  Android:layout_height="20dp"
                  Android:layout_marginTop="20dp"
                  Android:layout_marginRight="10dp"
                  Android:background="@drawable/showpass"
                  Android:layout_alignRight="@+id/etpass1"/>
          </RelativeLayout>    

 boolean show=true;
 //on image click inside password do this
 if(show){
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.hide);
                etpass2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());

                show=false;
            }else{
                imgshowhide2.setBackgroundResource(0);
                imgshowhide2.setBackgroundResource(R.drawable.showpass);
                //etpass1.setInputType(InputType.TYPE_TEXT);
                etpass2.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                etpass2.setSelection(etpass2.getText().length());
                show=true;
            }
0
Syed Danish Haider

Essayez ceci:

Commencez par définir un drapeau comme global comme ceci:

private boolean isShowPassword = false;

Et configurez le programme d'écoute pour qu'il puisse toucher le bouton Afficher et masquer le mot de passe:

imgPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isShowPassword) {
                    etPassword.setTransformationMethod(new PasswordTransformationMethod());
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_hide));
                    isShowPassword = false;
                }else{
                    etPassword.setTransformationMethod(null);
                    imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_show));
                    isShowPassword = true;
                }
            }
        });
0
reza_khalafi