android - setinputtype - Cambia programáticamente el tipo de entrada de EditText de PASSWORD a NORMAL y viceversa
inputtype edittext (18)
En mi aplicación, tengo un EditText
cuyo tipo de entrada predeterminado está configurado en android:inputType="textPassword"
por deault. Tiene un CheckBox
a su derecha, que cuando se marca, cambia el tipo de entrada de EditText a NORMAL PLAIN TEXT. El código para eso es-
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Mi problema es que cuando CheckBox está desmarcada, debería volver a establecer el tipo de entrada en PASSWORD. Lo he hecho usando-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
Pero, el texto dentro de ese texto de edición todavía está visible. Y para sorpresa, cuando cambio la orientación, automáticamente establece el tipo de entrada en PASSWORD y el texto en el interior está con viñetas (se muestra como una contraseña).
Cualquier forma de lograr esto?
Blockquote
recuento int [] final = {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]--;
}
}
});
Ok, después de horas de intentar finalmente lo implementé. A continuación está el código ...
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));
}
}
});
Explicaciones: - Tengo un botón con texto predeterminado como show. Después del evento onclick, verifica si se muestra el texto del botón. Si se muestra, entonces cambie el tipo de entrada, ajuste la posición del cursor y establezca el nuevo texto como se oculta en él.
Cuando está oculto ... haciendo lo contrario, es decir, ocultando la contraseña, ajustando el cursor y configurando el texto como se muestra. Y eso es. Está funcionando como un encanto.
Cambio el tipo de entrada en mi casilla de verificación, entonces en mi OnCheckedChangeListener
hago:
passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
Y finalmente funcionó.
Parece un problema booleano con TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
. Invierta la bandera y debería solucionar el problema.
En tu caso:
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Complete el código cuando desee aplicar la visibilidad de Contraseña en el texto de edición de Contraseña.
Crear un mango [Cualquier dibujable o casilla de verificación]
al hacer clic o en Marcar / Desmarcar escribe esto:
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 );
}
No olvides escribir esta línea:
edittext.setSelection(edittext.getText().length());
Restablece el cursor al final de la línea.
Desde la Biblioteca de soporte v24.2.0. puedes acivir esto muy fácil
Lo que debes hacer es simplemente:
Agregue la biblioteca de diseño a sus dependencias
dependencies { compile "com.android.support:design:25.1.0" }
Use
TextInputEditText
junto conTextInputLayout
<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
atributo passwordToggleEnabled
hará que aparezca la contraseña alternar
En su diseño de raíz, no olvide agregar
xmlns:app="http://schemas.android.com/apk/res-auto"
Puedes personalizar tu contraseña al alternar usando:
app:passwordToggleDrawable
- Drawable para usar como el ícono de alternancia de visibilidad de ingreso de contraseña.
app:passwordToggleTint
- Ícono a usar para el alternar de visibilidad de ingreso de contraseña.
app:passwordToggleTintMode
- Modo de fusión utilizado para aplicar el tinte de fondo.
Más detalles en la TextInputLayout .
Este es el controlador onClick completo para la imagen / botón para mostrar / ocultar la contraseña.
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);
}
};
Esto funcionó para mí:
mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
La característica de Alternar visibilidad de contraseña se ha agregado para admitir la versión 24.2.0 de la biblioteca que le permite alternar la contraseña directamente desde EditText
sin la necesidad de un CheckBox
.
Puede hacerlo básicamente actualizando primero su versión de la biblioteca de soporte a 24.2.0 y luego estableciendo un inputType
de inputType
de contraseña en TextInputEditText
. He aquí cómo hacerlo:
<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>
Puede obtener más información sobre la nueva característica en la documentación del desarrollador para TextInputLayout .
Mi búsqueda de una solución similar para Visual Studio / Xamarin me llevó a este hilo. Debajo está lo que funcionó para mí con Xamarin. Tenga en cuenta que esta implementación conserva el indicador TYPE_TEXT_FLAG_NO_SUGGESTIONS
al cambiar de modo.
EditText et = FindViewById<EditText>(Resource.Id.ET);
Para mostrar los caracteres: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;
et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;
Para ocultar caracteres: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;
Para establecer la posición en el final: int position = et.Text.Length;
et.SetSelection(position, position);
Otro ejemplo simple que utiliza ImageView para alternar la visibilidad con menos código, debido a la única asignación de InputType , solo necesitamos operador de igualdad:
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());
}
});
Reemplazando:
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
Con :
InputType.TYPE_CLASS_TEXT
Dará el mismo resultado pero palabra más corta.
Solo para las personas que tienen el mismo problema. Simplemente agrega un atributo adicional a EditText mediante programación y listo.
password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Además, asegúrese de que el cursor esté al final del texto en EditText. Porque, cuando cambia el tipo de entrada, el cursor se establecerá automáticamente en el punto de inicio. Entonces sugiero usar el siguiente código:
et_password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());
Al usar enlace de datos, puede hacer uso del siguiente código
<data>
<import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType=''@{someViewModel.isMasked ?
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }''
Solo un comentario adicional sobre la respuesta correcta proporcionada por @Rajkiran, es posible que desee agregar
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
al estado de entrada NORMAL para que los usuarios no se molesten por la autosugestión del teclado
Use este código para cambiar la contraseña al texto y viceversa. Este código funcionó perfectamente para mí. Prueba esto..
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);
}
}
});
alguna situación dinámica holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
no funcionará, así que es mejor usar ambos de esa manera
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
Nota: esto es adecuado para cuando usa controles dinámicos como el uso de arrayaapter
use este código para cambiar la contraseña al texto y viceversa
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());
}
}
});
para ver el código de muestra completo, consulte http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty
android:inputType="textPassword"
de su diseño. Es por eso que está cambiando a contraseña cuando cambia la orientación. Porque cada vez que cambia la orientación, la vista se recrea.
En cuanto al primer problema, intente esto:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
básicamente vaciar el texto antes de cambiar el tipo de entrada y luego volver a agregarlo.
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());
}
}
});
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
El método anterior en realidad no funcionó para mí. La respuesta a continuación funciona para 2.2 sdk.
password.setTransformationMethod (PasswordTransformationMethod.getInstance ());