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.
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());
C'est vraiment facile à réaliser depuis la bibliothèque de support v24.2.0.
Ce que vous devez faire c'est juste:
Ajoutez la bibliothèque de conception à vos dépendances
dependencies {
compile "com.Android.support:design:24.2.0"
}
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!
Dans votre mise en page racine, n'oubliez pas d'ajouter xmlns:app="http://schemas.Android.com/apk/res-auto"
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 .
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);
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());
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">
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);
}
}
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());
}
}
});
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;
}
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());
}
});
}
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());
}
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"
}
}
} );
...
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());
}
}
});
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
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.
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.
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;
}
});
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.
Ce que j'ai fait était de
Vous pouvez visionner cette vidéo pour une explication plus détaillée/ https://youtu.be/md3eVaRzdIM
J'espère que ça aide :)
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
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");
}
}
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.
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
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;
}
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;
}
}
});