Pregunta

Cuando un EditarTexto está en el modo de contraseña, parece que la pista se muestra en una fuente diferente (courrier?). ¿Cómo puedo evitar esto? Me gustaría que la pista a aparecer en la misma fuente que cuando el EditarTexto no está en el modo de contraseña.

Mi XML actual:

<EditText 
android:hint="@string/edt_password_hint"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:password="true"
android:singleLine="true" />
¿Fue útil?

Solución

Cambiar el tipo de letra en XML no funcionaba en el texto de sugerencia para mí tampoco. He encontrado dos soluciones diferentes, la segunda de las cuales tiene un mejor comportamiento para mí:

1) Quitar android:inputType="textPassword" de su archivo XML y, en cambio, en el conjunto en Java:

EditText password = (EditText) findViewById(R.id.password_text);
password.setTransformationMethod(new PasswordTransformationMethod());

Con este enfoque, la fuente indirecta se ve bien, pero como se está escribiendo en ese campo de edición, que no se ve cada carácter en texto plano antes de que se convierta en un punto de contraseña. También al hacer la entrada en pantalla completa, no aparecerán los puntos, pero la contraseña en texto claro.

2) Dejar android:inputType="textPassword" en su XML. En Java, set también el tipo de letra y passwordMethod:

EditText password = (EditText) findViewById(R.id.register_password_text);
password.setTypeface(Typeface.DEFAULT);
password.setTransformationMethod(new PasswordTransformationMethod());

Este enfoque me dio la pista fuente que quería y me da el comportamiento que quiera con los puntos de contraseña.

Espero que ayude!

Otros consejos

he encontrado este consejo útil de la guía Diálogos

  

Consejo: Por defecto, cuando se establece un elemento EditarTexto utilizar el tipo de entrada "textPassword", la familia de la fuente se establece en espacio sencillo, por lo que debe cambiar su familia de fuentes a "sans-serif" para que ambos campos de texto utilizan un estilo de fuente correspondiente.


Por ejemplo

android:fontFamily="sans-serif"

Esto es lo que hice para solucionar este problema. Por alguna razón que no tenía que establecer el método de transformación por lo que esta puede ser una solución mejor:

En mi xml:

<EditText
    android:id="@+id/password_edit_field"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:hint="Password"
    android:inputType="textPassword" />

En mi Activity:

EditText password = (EditText) findViewById( R.id.password_edit_field );
password.setTypeface( Typeface.DEFAULT );

Los descansos de aproximación setTransformationMethod Android: imeOption para mí, y permite que los retornos de carro que se escriban en el campo de la contraseña. En lugar de eso estoy haciendo esto:

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);

Y no soy la creación androide: password = "true" en XML.

El manisha respuesta proporcionada funciona, pero deja el campo de la contraseña en un estado no estándar en comparación con el valor predeterminado. Es decir, el tipo de fuente por defecto a continuación, se aplica también al campo de contraseña, incluyendo tanto los reemplazos de puntos y los caracteres de vista previa que aparece antes de ser reemplazado con los puntos (así como cuando se trata de un campo "contraseña visible").

Para solucionar este problema y poner el partido 1) parecen y actúan exactamente igual que el tipo de entrada textPassword defecto, sino también 2) permitir que el texto de sugerencia que aparezca en una fuente por defecto (no espacio sencillo), es necesario tener un TextWatcher en el campo que puede alternar el tipo de fuente adecuada de ida y vuelta entre Typeface.DEFAULT y Typeface.MONOSPACE en función de si está vacío o no. He creado una clase de ayuda que se puede utilizar para llevar a cabo lo siguiente:

import android.graphics.Typeface;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.inputmethod.EditorInfo;
import android.widget.TextView;

/**
 * This class watches the text input in a password field in order to toggle the field's font so that the hint text
 * appears in a normal font and the password appears as monospace.
 *
 * <p />
 * Works around an issue with the Hint typeface.
 *
 * @author jhansche
 * @see <a
 * href="http://stackoverflow.com/questions/3406534/password-hint-font-in-android">http://stackoverflow.com/questions/3406534/password-hint-font-in-android</a>
 */
public class PasswordFontfaceWatcher implements TextWatcher {
    private static final int TEXT_VARIATION_PASSWORD =
            (EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD);
    private TextView mView;

    /**
     * Register a new watcher for this {@code TextView} to alter the fontface based on the field's contents.
     *
     * <p />
     * This is only necessary for a textPassword field that has a non-empty hint text. A view not meeting these
     * conditions will incur no side effects.
     *
     * @param view
     */
    public static void register(TextView view) {
        final CharSequence hint = view.getHint();
        final int inputType = view.getInputType();
        final boolean isPassword = ((inputType & (EditorInfo.TYPE_MASK_CLASS | EditorInfo.TYPE_MASK_VARIATION))
                == TEXT_VARIATION_PASSWORD);

        if (isPassword && hint != null && !"".equals(hint)) {
            PasswordFontfaceWatcher obj = new PasswordFontfaceWatcher(view);
            view.addTextChangedListener(obj);

            if (view.length() > 0) {
                obj.setMonospaceFont();
            } else {
                obj.setDefaultFont();
            }
        }
    }

    public PasswordFontfaceWatcher(TextView view) {
        mView = view;
    }

    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
        // Not needed
    }

    public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
        if (s.length() == 0 && after > 0) {
            // Input field went from empty to non-empty
            setMonospaceFont();
        }
    }

    public void afterTextChanged(final Editable s) {
        if (s.length() == 0) {
            // Input field went from non-empty to empty
            setDefaultFont();
        }
    }

    public void setDefaultFont() {
        mView.setTypeface(Typeface.DEFAULT);
    }

    public void setMonospaceFont() {
        mView.setTypeface(Typeface.MONOSPACE);
    }
}

A continuación, a hacer uso de ella, todo lo que tiene que hacer es llamar al método register(View) estática. Todo lo demás es automático (incluyendo saltar la solución si la vista no lo requiere!):

    final EditText txtPassword = (EditText) view.findViewById(R.id.txt_password);
    PasswordFontfaceWatcher.register(txtPassword);

Hay muchas maneras de resolver este problema, pero cada forma tiene ventajas y desventajas. Aquí está mi prueba

Sólo cara este problema de fuente en algún dispositivo (lista al final de mi respuesta) cuando se active la contraseña de entrada por

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

Si utilizo android:inputType="textPassword", este problema no sucedió

Algo he tratado

1) Uso setTransformationMethod lugar inputType

edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
  • Fuente funcionando bien
  • pantalla del teclado no muy bien (sólo se muestra texto, no se muestran el número en la parte superior del texto)

2) Uso Typeface.DEFAULT

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
  • Teclado pantalla así ,
  • Fuente puede trabajar bien no . Ejemplo sans-serif-light es una fuente predeterminada para todos View en mi solicitud => después de setTypeface(Typeface.DEFAULT), la fuente EditText todavía se ven diferente en algún dispositivo

3) Uso android:fontFamily="sans-serif"

Mi solución

  

caché el tipo de letra antes de volver a colocarla setInputType

Typeface cache = edtPassword.getTypeface();
edtPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
edtPassword.setTypeface(cache);

Prueba
Algunos se enfrentan al problema de fuentes de dispositivo

  • Xiaomi A2 (8.0.1)
  • Pixel XL (8.1.0)
  • Sony Xperia Z5 Au (SOV32) (6,0)
  • Arrow NX (F-04G) (6.0.1)
  • Kyocera (S2) (7,0)

Algunos problemas en el dispositivo no cara de la fuente

  • Samsung S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Nodo 5 (5.1.1)
  • Samsung S7 Edge (SM-G935F) (7,0)

Las otras respuestas son la solución adecuada para la mayoría de los casos.

Sin embargo, si usted está utilizando una subclase EditText personalizada a, por ejemplo, se aplica una fuente personalizada de forma predeterminada, hay un problema sutil. Si establece la fuente personalizada en el constructor de la subclase, todavía será sobrescrito por el sistema si se establece inputType="textPassword".

En este caso, mueva el estilo de onAttachedToWindow después de su llamada super.onAttachedToWindow.

Ejemplo aplicación:

package net.petosky.android.ui;

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;

/**
 * An EditText that applies a custom font.
 *
 * @author cory@petosky.net
 */
public class EditTextWithCustomFont extends EditText {

    private static Typeface customTypeface;

    public EditTextWithCustomFont(Context context) {
        super(context);
    }

    public EditTextWithCustomFont(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EditTextWithCustomFont(
            Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * Load and store the custom typeface for this app.
     *
     * You should have a font file in: project-root/assets/fonts/
     */
    private static Typeface getTypeface(Context context) {
        if (customTypeface == null) {
            customTypeface = Typeface.createFromAsset(
                    context.getAssets(), "fonts/my_font.ttf");
        }
        return customTypeface;
    }

    /**
     * Set a custom font for our EditText.
     *
     * We do this in onAttachedToWindow instead of the constructor to support
     * password input types. Internally in TextView, setting the password
     * input type overwrites the specified typeface with the system default
     * monospace.
     */
    @Override protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        // Our fonts aren't present in developer tools, like live UI
        // preview in AndroidStudio.
        if (!isInEditMode()) {
            setTypeface(getTypeface(getContext()));
        }
    }
}

También puede utilizar una costumbre Widget. Es muy sencillo y no recarga la Actividad / Fragmento de Código.

Aquí está el código:

public class PasswordEditText extends EditText {

  public PasswordEditText(Context context) {
    super(context);
    init();
  }

  public PasswordEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();

  }

  public PasswordEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
  }

  private void init() {
    setTypeface(Typeface.DEFAULT);
  }
}

Y el código XML tendrá el siguiente aspecto:

<com.sample.PasswordEditText
  android:id="@+id/password_edit_field"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:hint="Password"
  android:inputType="textPassword"
  android:password="true" />

Sé que esto puede ser el más antiguo, pero he jorobas en algo relacionado con este tema cuando utilicé InputTypetogether app:passwordToggleEnabled="true"and.

Por lo tanto, escribir esto, ya que puede ayudar a alguien aquí.

Quiero utilizar una fuente personalizada al campo de contraseña junto con la opción app:passwordToggleEnabled para mi campo de introducción de la contraseña. Pero en 27.1.1 (al escribir esto) biblioteca de soporte, que estaba fallando.

Así que el código fue como a continuación:

<android.support.design.widget.TextInputLayout
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/_10dp"
        android:layout_marginTop="@dimen/_32dp"
        android:hint="@string/current_password"
        android:textColorHint="@color/hint_text_color"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/black">


        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start|left"
            android:maxLines="1"
            android:textAlignment="viewStart"
            android:textColor="@color/black"
            android:textColorHint="@color/camel"
            android:textSize="@dimen/txt_16sp"
            app:font_style="regular"
            app:drawableEnd="@drawable/ic_remove_eye" />

    </android.support.design.widget.TextInputLayout>

Código mencionados no disponen de inputType definido en XML

EditText password = (EditText) findViewById(R.id.password);
password.setTransformationMethod(new PasswordTransformationMethod());

Y en Java, setTransformationMethod me ayudará a adquirir las propiedades de tipo de entrada textPassword y también estoy feliz de que mi estilo de fuente personalizado.

Pero el accidente mencionados a continuación ocurrió en todos los niveles de la API con la biblioteca 27.1.1 apoyo.

  

java.lang.NullPointerException: intento de invocar método virtual vacío'   android.support.design.widget.CheckableImageButton.setChecked (boolean)'   en una referencia de objeto nulo

Esto estaba fallando debido a la onRestoreInstanceState dentro clase TextInputLayout.

reproducen pasos: Alternar la visibilidad contraseña y minimizar la aplicación y abierto desde las aplicaciones recientes. Uh, ho Crashed!

Todo lo que necesita es la contraseña por defecto de palanca opción (usando la biblioteca de soporte) y fuente personalizada en el campo de introducción de la contraseña.

Después de algún tiempo, descubierto por hacer de la siguiente manera:

<android.support.design.widget.TextInputLayout
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/_10dp"
        android:layout_marginTop="@dimen/_32dp"
        android:hint="@string/current_password"
        android:textColorHint="@color/hint_text_color"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:passwordToggleEnabled="true"
        app:passwordToggleTint="@color/black">


        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start|left"
            android:maxLines="1"
            android:textAlignment="viewStart"
            android:textColor="@color/black"
            android:textColorHint="@color/camel"
            android:textSize="@dimen/txt_16sp"
            app:font_style="regular"
            app:drawableEnd="@drawable/ic_remove_eye"
            android:inputType="textPassword" />

    </android.support.design.widget.TextInputLayout>

En XML, android:inputType="textPassword" añadido

TextInputLayout inputPassword = findViewById(R.id.input_password);
EditText password = findViewById(R.id.password);
EditText userName = findViewById(R.id.user_name);
// Get the typeface of user name or other edit text
Typeface typeface = userName.getTypeface();
if (typeface != null)
   inputLayout.setTypeface(typeface); // set to password text input layout

En el código java anterior,

I adquirió el tipo de letra personalizado de nombre de usuario EditText y lo aplicó a TextInputLayout del campo de contraseña. Ahora no es necesario para establecer el tipo de letra de forma explícita a la EditText contraseña, ya que adquirirá la propiedad TextInputLayout.

también, quité password.setTransformationMethod(new PasswordTransformationMethod());

De esta manera, passwordToggleEnabled está funcionando, la fuente personalizada también se aplica y adiós a la caída. Esperamos que este problema se solucionará en las próximas versiones de apoyo.

caligrafía biblioteca .

entonces todavía suele actualizar los campos de contraseña con la fuente correcta. así que hacer esto en código no en XML:

Typeface typeface_temp = editText.getTypeface();
editText.setInputType(inputType); /*whatever inputType you want like "TYPE_TEXT_FLAG_NO_SUGGESTIONS"*/
//font is now messed up ..set it back with the below call
editText.setTypeface(typeface_temp); 

I añadido recientemente la capacidad de cambio de palanca de espacio sencillo de encendido / apagado a un extensión de EditarTexto específicamente para contraseñas puede ayudar a algunas personas. No utiliza android:fontFamily por lo que es compatible con <16.

También puede utilizar el

<android.support.design.widget.TextInputLayout/>

junto con

<android.support.v7.widget.AppCompatEditText/>

Me utilizar esta solución para cambiar el tipo de letra en función de la visibilidad indirecta. Es similar a la respuesta de Joe, pero extendiéndose EditarTexto lugar:

public class PasswordEditText extends android.support.v7.widget.AppCompatEditText {

    public PasswordEditText(Context context) {
        super(context);
    }

    public PasswordEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        if (text.length() > 0) setTypeface(Typeface.MONOSPACE);
        else setTypeface(Typeface.DEFAULT);
    }

}

En el caso de utilizar el caligrafía biblioteca en combinación con un TextInputLayout y un EditarTexto, la siguiente código funciona bien.

    EditText password = (EditText) findViewById(R.id.password);
    TextInputLayout passwordLayout = (TextInputLayout) findViewById(R.id.passwordLayout);

    Typeface typeface_temp = password.getTypeface();
    password.setInputType(InputType.TYPE_CLASS_TEXT |
            InputType.TYPE_TEXT_VARIATION_PASSWORD); 

    password.setTypeface(typeface_temp);
    passwordLayout.setTypeface(typeface_temp);

Un caso raro tal vez, pero he experimentado con esto y descubrió que:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setTransformationMethod(new PasswordTransformationMethod());

cambió el Tamaño de la fuente de la pista en lugar de la fuente en sí! Esto es todavía un efecto no deseado. Curiosamente, la operación inversa:

password.setTransformationMethod(new PasswordTransformationMethod());
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

mantiene el mismo tamaño de fuente.

He encontrado una solución segura a este problema

La mejor manera de Hola, he encontrado una solución a este problema segura

La mejor manera es crear una costumbre EDITTEXT y guardar el valor de tipo de letra como empleado temporal y luego aplicar el método a los cambios InputType, Por último, un retroceso en el valor de tipo de letra a la temperatura EDITTEXT. de esta manera:

public class AppCompatPasswordEditText extends AppCompatEditText {


    public AppCompatPasswordEditText(Context context) {
        super(context);
    }

    public AppCompatPasswordEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public AppCompatPasswordEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        // Our fonts aren't present in developer tools, like live UI
        // preview in AndroidStudio.
        Typeface cache = getTypeface();

        if (!isInEditMode() && cache != null) {
            setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
            setTypeface(cache);
        }
    }

}

Esta manera de hacer que la contraseña de entrada que tiene sugerencia que no se convirtió al tipo de letra predeterminado * y !!.

En XML:

android:inputType="textPassword"
android:gravity="center"
android:ellipsize="start"
android:hint="Input Password !."

En Actividad:

inputPassword.setTypeface(Typeface.DEFAULT);

gracias a: mango y rjrjr por la información:. D

al igual que el anterior, pero asegúrese de que los campos no tienen el estilo negrita en XML, ya que nunca tendrán el mismo aspecto incluso con la revisión anterior!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top