Par programme changer le type d'entrée de l'EditText de MOT de passe pour NORMAL et vice-versa
dans mon application, j'ai un EditText
dont le type d'entrée par défaut est défini à android:inputType="textPassword"
par deault. Il a un CheckBox
à sa droite, ce qui, une fois vérifié, change le type d'entrée de ce texte édité en texte normal. Le Code pour cela est
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
mon problème est, quand cette case à cocher n'est pas cochée, il devrait à nouveau définir le type d'entrée à mot de passe. Je l'ai fait en utilisant-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
mais, le texte à l'intérieur de ce texte est toujours visible. Et pour surprise, quand je change l'orientation, il règle automatiquement le type d'entrée au mot de passe et le texte à l'intérieur est mis en Puce (montré comme un mot de passe).
comment y parvenir?
21 réponses
Juste pour les gens qui ont le même problème. Il suffit d'ajouter un attribut supplémentaire à cette EditText programmatically et vous êtes fait.
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
Aussi, assurez-vous que le curseur est à la fin du texte, dans l'EditText. Parce que, lorsque vous changez le type d'entrée, le curseur sera automatiquement positionné au 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());
lors de L'utilisation de Data Binding, vous peut 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) {
// show password
mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
} else {
// hide password
mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
pour le code d'échantillon complet, référez-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. Réponse ci-dessous fonctionne pour sdk 2.2.
mot de passe.setTransformationMethod (PasswordTransformationMethod.getInstance ());
un autre exemple simple utilisant ImageView pour basculer la visibilité avec moins de code, en raison de l'unique InputType assign we need only equality operator:" 15198090920"
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());
}
});
remplaçant:
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
avec:
InputType.TYPE_CLASS_TEXT
donnera le même résultat mais le mot 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());
}
}
});
cela a fonctionné pour moi:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
Ok donc après des heures d'essai finalement mis en œuvre. Ci-dessous est le code ..
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 afficher. Après l'événement onclick sur elle en vérifiant si le texte du bouton est affiché. S'il s'agit de show,changez le type d'entrée, ajustez la position du curseur et définissez new text comme hide in it.
quand c'est de la peau... faire marche arrière, c'est-à-dire cacher le mot de passe,régler le curseur et définir le texte comme spectacle. Et c'est tout. Il se porte comme un charme.
pour les utilisateurs de 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. Ce code a parfaitement fonctionné pour moi. Essayez ceci..
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);
}
}
});
la fonctionnalité de bascule de visibilité de mot de passe a été ajoutée pour prendre en charge la version 24.2.0 de la bibliothèque vous permettant de bascule le mot de passe directement à partir du EditText
sans avoir besoin d'un CheckBox
.
vous pouvez faire ce travail essentiellement en mettant d'abord à jour votre version de bibliothèque de soutien à 24.2.0 et en mettant ensuite un inputType
de mot de passe sur le TextInputEditText
. Voici comment faire:
<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'information sur le nouvelle fonctionnalité sur la documentation du développeur pour TextInputLayout .
c'est le handler onClick complet pour le bouton Image/pour afficher/cacher 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);
}
};
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 le drapeau 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 cacher les caractères:
et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
pour régler la position de fin:
int position = et.Text.Length;
et.SetSelection(position, position);
dynamique de la situation holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
ne fonctionne pas alors il vaut mieux utiliser à la fois comme
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
Note : Ceci est adapté pour quand vous utilisez des commandes dynamiques comme l'utilisation de arrayaapter
depuis la bibliothèque V24.2.0. vous pouvez y arriver très facilement
ce que vous devez faire est juste:
-
Ajouter à la bibliothèque de conception pour votre avec des dépendances
dependencies { compile "com.android.support:design:25.1.0" }
-
utiliser
TextInputEditText
en conjonction avecTextInputLayout
<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>
passwordToggleEnabled
attribut fera apparaître la bascule de mot de passe
-
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
- il peut être utilisé comme icône de bascule de visibilité d'entrée de mot de passe.
app:passwordToggleTint
- icône à utiliser pour la bascule de visibilité d'entrée de mot de passe.
app:passwordToggleTintMode
- mélange mode utilisé pour appliquer la teinte de fond.
plus de détails dans TextInputLayout documentation .
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 ça a finalement marché.
semble être un problème booléen avec TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
. Inversez le drapeau et ça devrait régler le problème.
dans votre cas:
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
je supprimerais android:inputType="textPassword"
de votre mise en page. C'est la raison pour laquelle il est de revenir au mot de passe lorsque l'orientation change. Parce que chaque fois que l'orientation change, la vue est recréée.
comme pour le premier problème essayez ceci:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
fondamentalement, vider le texte avant de changer le type d'entrée, puis l'ajouter.
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 de sorte que les utilisateurs ne seront pas ennuyés par l'Auto-suggestion du clavier
code complet lorsque vous voulez appliquer la visibilité du mot de passe dans le mot de passe modifier le texte.
créer une poignée [N'importe quelle tirette ou case à cocher]
, cliquez sur ou sur Cochée/Décocher écrire 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[] table = {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 un id D'un texte D'édition 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)
}
}
après setInputType
pour un champ de mot de passe, vous aurez problème avec FONT
Voici ma solution pour afficher / cacher 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);
}
Note: j'utilise InputType.TYPE_TEXT_VARIATION_PASSWORD
au lieu de InputType.TYPE_CLASS_TEXT
ou HideReturnsTransformationMethod
parce que je veux que le clavier affiche à la fois le texte et le numéro