Dans mon application, j'ai un EditText
dont le type d'entrée par défaut est défini sur Android:inputType="textPassword"
par deault. Il a un CheckBox
à sa droite, ce qui, une fois coché, change le type d'entrée de cet EditText en NORMAL PLAIN TEXT. Le code pour cela est
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Mon problème est que, lorsque cette case à cocher n'est pas cochée, il faut à nouveau définir le type d'entrée sur PASSWORD. Je l'ai fait en utilisant-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
Mais, le texte à l'intérieur de cet edittext est toujours visible. Et par surprise, lorsque je change d’orienatation, le type de saisie est automatiquement défini sur PASSWORD et le texte à l’intérieur est marqué d’une puce (affiché comme un mot de passe).
Un moyen d'y parvenir?
Juste pour les personnes qui ont le même problème. Ajoutez simplement un attribut supplémentaire à cet EditText par programme et vous avez terminé.
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
Assurez-vous également que le curseur se trouve à la fin du texte dans le texte d'édition. En effet, lorsque vous modifiez le type d'entrée, le curseur se positionne automatiquement sur le point de départ. Je suggère donc d'utiliser le code suivant:
et_password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());
Lorsque vous utilisez la liaison de données, vous pouvez utiliser le code suivant
<data>
<import type="Android.text.InputType"/>
.
.
.
<EditText
Android:inputType='@{someViewModel.isMasked ?
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'
Si vous utilisez Kotlin,
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
utilisez ce code pour changer le mot de passe en texte et vice versa
mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is changed from uncheck to checked.
if (!isChecked) {
// hide password
mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
} else {
// show password
mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
pour obtenir un exemple complet de code, reportez-vous à http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
La méthode ci-dessus n'a pas vraiment fonctionné pour moi. La réponse ci-dessous fonctionne pour 2.2 sdk.
password.setTransformationMethod (PasswordTransformationMethod.getInstance ());
Un autre exemple simple utilisant ImageView pour basculer la visibilité avec moins de code, en raison de l'unique InputType, nous n'avons besoin que de l'opérateur d'égalité:
EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
}else {
inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
inputPassword.setSelection(inputPassword.getText().length());
}
});
Remplacement:
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
Avec :
InputType.TYPE_CLASS_TEXT
Donnera le même résultat mais Word plus court.
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is checked.
if (isChecked) {
//password is visible
PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
} else {
//password gets hided
passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());
}
}
});
buttons.get(2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.hide));
}else{
editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
//editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
editTexts.get(1).setSelection(editTexts.get(1).getText().length());
buttons.get(2).setText(getResources().getString(R.string.show));
}
}
});
Explications: - J'ai un bouton avec le texte par défaut comme show. Après l'événement onclick, vérifiez si le texte du bouton est affiché. S'il est affiché, changez le type d'entrée, ajustez la position du curseur et définissez le nouveau texte comme masqué.
Quand il est caché ... faire l’inverse, c’est-à-dire cacher le mot de passe, ajuster le curseur et définir le texte comme indiqué. Et c'est tout. Cela fonctionne comme un charme.
Cela a fonctionné pour moi:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
Utilisez ce code pour changer le mot de passe en texte et vice versa. Ce code a parfaitement fonctionné pour moi. Essaye ça..
EditText paswrd=(EditText)view.findViewById(R.id.paswrd);
CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
paswrd.setInputType(InputType.TYPE_CLASS_TEXT);
}else{
paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
}
});
Pour les utilisateurs de kotlin:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Il s'agit du gestionnaire onClick complet de l'image/du bouton pour afficher/masquer le mot de passe.
new OnClickListener() {
@Override
public void onClick(View v) {
// current ursor position
int cursorPosition = edtPassword.getSelectionStart();
// toggles the control variable
isPassworsVisible = !isPassworsVisible;
// sets the image toggler inside edit text
passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));
// apply input type
edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
// returns cursor to position
edtPassword.setSelection(cursorPosition);
}
};
La fonctionnalité Basculer la visibilité du mot de passe a été ajoutée pour prendre en charge la version de bibliothèque 24.2.0, vous permettant de basculer le mot de passe directement à partir de la variable EditText
sans nécessiter de CheckBox
.
Pour ce faire, vous pouvez essentiellement mettre à jour votre version de bibliothèque de support vers 24.2.0, puis définir un inputType
de mot de passe sur TextInputEditText
. Voici comment faire cela:
<Android.support.design.widget.TextInputLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.design.widget.TextInputEditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="@string/password"
Android:inputType="textPassword"/>
</Android.support.design.widget.TextInputLayout>
Vous pouvez obtenir plus d'informations sur la nouvelle fonctionnalité de la documentation pour développeurs de TextInputLayout .
Depuis la bibliothèque de support v24.2.0. vous pouvez réaliser cela très facilement
Ce que vous devez faire c'est juste:
Ajoutez la bibliothèque de conception à vos dépendances
dependencies {
compile "com.Android.support:design:25.1.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.support.design.widget.TextInputEditText
Android:id="@+id/etPassword"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="@string/password_hint"
Android:inputType="textPassword"/>
</Android.support.design.widget.TextInputLayout>
L'attribut passwordToggleEnabled
fera apparaître le basculement du mot de passe
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 la bascule de visibilité d'entrée de mot de passe.app:passwordToggleTintMode
- Mode de fusion utilisé pour appliquer la teinte de fond.
Plus de détails dans documentation TextInputLayout .
Ma recherche d'une solution similaire pour Visual Studio/Xamarin m'a conduit à ce fil. Voici ce qui a fonctionné pour moi avec Xamarin. Notez que cette implémentation conserve l'indicateur TYPE_TEXT_FLAG_NO_SUGGESTIONS
lors de la commutation entre les modes.
EditText et = FindViewById<EditText>(Resource.Id.ET);
Pour afficher les caractères: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;
Pour masquer des caractères: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
Pour définir la position à la fin: int position = et.Text.Length;
et.SetSelection(position, position);
une situation dynamique holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
ne fonctionnera pas, donc mieux utiliser les deux comme ça
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
Remarque: cela convient lorsque vous utilisez des contrôles dynamiques comme utiliser arrayaapter
Après vous setInputType
pour un champ de mot de passe, vous aurez problème avec FONT
Voici ma solution pour afficher/masquer le mot de passe sans problème de police
protected void onCreate(Bundle savedInstanceState) {
...
findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPasswordVisible(edtPassword)) {
enableInputHiddenPassword(edtPassword);
} else {
enableInputVisiblePassword(edtPassword);
}
edtPassword.setSelection(edtPassword.getText().length());
}
});
}
final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;
private boolean isPasswordVisible(EditText editText) {
return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}
private void enableInputVisiblePassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
editText.setTypeface(cache);
}
private void enableInputHiddenPassword(EditText editText) {
Typeface cache = editText.getTypeface();
editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
editText.setTypeface(cache);
}
Remarque: J'utilise InputType.TYPE_TEXT_VARIATION_PASSWORD
au lieu de InputType.TYPE_CLASS_TEXT
ou HideReturnsTransformationMethod
parce que je veux que le clavier affiche le texte et le nombre.
Je change le type d'entrée sur ma case à cocher, donc sur mon OnCheckedChangeListener
je fais:
passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
Et cela a finalement fonctionné.
Cela ressemble à un problème booléen avec TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
. Inverser le drapeau et cela devrait résoudre le problème.
Dans ton cas:
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Code complet lorsque vous souhaitez appliquer la visibilité du mot de passe dans Texte de modification du mot de passe.
Créer une poignée [Toute boîte dessinable ou case à cocher]
sur clic ou sur Checked/Uncheck écrivez ceci:
if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD );
}else{
edittext.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
}
N'oubliez pas d'écrire cette ligne:
edittext.setSelection(edittext.getText().length());
Il remet le curseur à la fin de la ligne.
Blockquote
final int [] count = {0};
showandhide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(count[0] ==0)
{
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
count[0]++;
}
else {
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
showandhide.setText("Hide");
count[0]--;
}
}
});
Basé sur les réponses de neeraj t et Everton Fernandes Rosario j'ai écrit dans Kotlin, où password
est l'identifiant d'un EditText dans votre mise en page.
// Show passwords' symbols.
private fun showPassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = HideReturnsTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
// Show asterisks.
private fun hidePassword() {
password.run {
val cursorPosition = selectionStart
transformationMethod = PasswordTransformationMethod.getInstance()
setSelection(cursorPosition)
}
}
Juste un commentaire supplémentaire sur la bonne réponse fournie par @Rajkiran, vous pouvez ajouter
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
à l'état d'entrée NORMAL pour que les utilisateurs ne soient pas dérangés par la suggestion automatique du clavier
Je retirerais Android:inputType="textPassword"
de votre mise en page. C'est pourquoi il revient au mot de passe lorsque l'orientation change. Parce que chaque fois que l'orientation change, la vue est recréée.
En ce qui concerne le premier problème, essayez ceci:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
essentiellement vider le texte avant de changer le type d'entrée, puis de le rajouter.