2010-09-10 10 views

Respuesta

88

Puede cambiar dinámicamente los atributos de un TextView. Si configurara XML Atrribute android:password como verdadero, la vista mostraría puntos si establece que el texto es falso.

Con el método setTransformationMethod debería poder cambiar estos atributos del código. (Negación:.. No he probado si el método sigue funcionando después de que se muestre la vista Si tiene problemas con eso me deja un comentario para que yo sepa)

El código de ejemplo completo sería

yourTextView.setTransformationMethod(new PasswordTransformationMethod()); 

para ocultar la contraseña. Para mostrar la contraseña, puede establecer uno de los métodos de transformación existentes o implementar un TransformationMethod vacío que no hace nada con el texto de entrada.

yourTextView.setTransformationMethod(new DoNothingTransformation()); 
+31

Para mostrar la contraseña, no necesita crear ninguna clase nueva. Simplemente llame a 'setTransformationMethod (null)'. –

+2

@Janusz, el uso de lo siguiente dará solución gud.setTransformationMethod (PasswordTransformationMethod.getInstance()); y setTransformationMethod (HideReturnsTransformationMethod.getInstance()); –

+0

@Janusz, pero ¿cómo mostrar/ocultar las teclas en el teclado? – NarendraJi

2

¿Has probado con setTransformationMethod? Se hereda de TextView y quiere un TransformationMethod como parámetro.

Puede encontrar más información sobre TransformationMethods here.

También tiene algunas características geniales, como la sustitución de personajes.

+0

Enlace en respuesta está muerto - * "Código de estado: 404 Not Found" *. – Pang

89

Para mostrar los puntos en lugar de la contraseña establecida la PasswordTransformationMethod:

yourEditText.setTransformationMethod(new PasswordTransformationMethod()); 

, por supuesto, se puede establecer esto por defecto en su elemento EditarTexto en el diseño xml con

android:password 

Para volver a mostrar la contraseña legible, simplemente pase null como método de transformación:

yourEditText.setTransformationMethod(null); 
+7

' android: password' está en desuso ahora, y debe usar 'android: inputType' en su lugar. – Wilka

+40

También puede hacer felices a sus usuarios guardando la posición del cursor antes de configurar el método de transformación y restaurarlo después. Use' editText.getSelectionStart () 'y' editText.getSelectionEnd() 'para guardar la posición del cursor y' editText.setSelection (start, end) 'para restaurarlo – Mostafa

+1

@Wilka: android: inputType NO le permite alternar entre los dos estados en ejecución -tiempo. Solo te permite cambiar una vez y una vez que lo cambias, no puedes volver a cambiarlo. Y no, el setTransformationMethod NO está en desuso. – AndroidDev

63

Para mostrar:

editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 

Para ocultar:

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

Después de cada una de ellas el cursor se pone a cero, por lo que:

editText.setSelection(editText.length()); 
+0

Probado en Android 4.3 y 5.0, ¡funciona genial! Los documentos hacen que parezca que esto debería funcionar hasta API 3. – James

+0

@MattLogan, pero ¿cómo mostrar/ocultar las teclas en el teclado? – NarendraJi

+4

Esta debería ser la respuesta aceptada –

9

Uso casilla de verificación y cambiar el tipo de entrada según corresponda .

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); 
    } 
} 
+0

Funcionó como un encanto gracias :) –

3

Es trabajo para mí.Esto le ayudará definitivamente

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()); 
       } 

      } 
     }); 
4

siento que quiero responder a esta pregunta aún hay algunas buenas respuestas,

según la documentación TransformationMethod hacer nuestra misión

TransformationMethod

TextView utiliza TransformationMethods para hacer cosas como reemplazar el caracteres de contraseñas con puntos, o evitar que los caracteres de nueva línea causen saltos de línea en campos de texto de una sola línea.

Aviso utilizo cuchillo de mantequilla, pero es el mismo si el usuario verificación Mostrar contraseña

@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

soy capaz de añadir el código/HidePassword ShowPassword con sólo unas pocas líneas, auto-contenida en un bloque:

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" 
      } 
     } 
    }); 
    ... 
2

Probar https://github.com/maksim88/PasswordEditText proyecto en github. Ni siquiera necesita cambiar su código Java usándolo. Sólo cambia

EditarTexto

etiqueta para

com.maksim88.passwordedittext.PasswordEditText

en el archivo XML.

+0

¿Tiene alguna idea de cómo usar setError con este componente, una vez que el error está marcado, el icono de mostrar/ocultar se vuelve invisible – guisantogui

149

Es realmente fácil de conseguir desde la Biblioteca de soporte v24.2.0.

Lo que hay que hacer es:

  1. Agregar la biblioteca de diseño a sus dependecies

    dependencies { 
        compile "com.android.support:design:24.2.0" 
    } 
    
  2. Uso TextInputEditText conjuntamente con 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> 
    

¡El atributo passwordToggleEnabled hará el trabajo!

  1. En su diseño raíz no se olvide de añadir xmlns:app="http://schemas.android.com/apk/res-auto"

  2. puede personalizar sus palanca contraseña mediante:

app:passwordToggleDrawable - Disponibles a utilizar como el icono de alternancia de visibilidad de entrada de contraseña.
app:passwordToggleTint - Icono que se utiliza para el alternar de visibilidad de entrada de contraseña.
app:passwordToggleTintMode - Modo de fusión utilizado para aplicar el tinte de fondo.

Más detalles en TextInputLayout documentation.

enter image description here

+0

En la versión 25.1.0 tengo un comportamiento raro: muestra la contraseña alternar una vez, pero si lo presiona, desaparecerá o_O ' – MiguelHincapieC

+1

Sí, también hay algunos caprichos con el atributo 'android: text' en' TextInputEditText'. Siempre puede plantear un problema en [Google Issues Tracker para Android] (https://code.google.com/p/android/issues/list) – mmBs

+0

¿Hay alguna forma de mover el icono hacia la izquierda? –

1

Lo que hice fue

  1. Crear una vista de edición de texto y una vista de texto normal
  2. Hacer ellas se superponen entre sí mediante el uso de diseño restricción (al igual pantalla de la aplicación de inicio de sesión de Facebook)
  3. Adjunte un onClickListener a la vista de texto normal para que cambie el tipo de entrada de la vista de texto de edición en consecuencia (Visible/No visible)

Es posible que echa un vistazo a este video para un pasos más detallados y explicaciones https://youtu.be/md3eVaRzdIM

espero que ayude :)

2
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()); 

     } 
    }); 
} 
3

es posible mostrar/contraseña OCULTAR usar este código a continuación:

CÓDIGO 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 CÓDIGO:

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()); 
     } 
    } 
}); 
-1
if (inputPassword.getTransformationMethod() == PasswordTransformationMethod.getInstance()) { 
//password is visible 
       inputPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
      } 
else if(inputPassword.getTransformationMethod() == HideReturnsTransformationMethod.getInstance()) { 
//password is hidden 
       inputPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
      } 
7

Puede usar aplicación: passwordToggleEnabled = "true"

aquí es ejemplo dado a continuación

<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"> 
0

Aquí está mi solución sin utilizar TextInputEditText y Método de transformación

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> 

Código de Java

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; 
     } 
    }); 
0

compilación 'com.android.support:appcompat-v7:24.2.0'

compilación ' com.android.support:design:24.2.0 '

en la disposición

android:inputType="textPassword" 

Su trabajo

Cuestiones relacionadas