Frage

Wenn ein EditText in Passwort-Modus ist, scheint es, dass der Hinweis in einer anderen Schriftart angezeigt wird (courrier?). Wie kann ich das vermeiden? Ich würde den Hinweis gerne in derselben Schriftart angezeigt wird, dass, wenn die EditText nicht im Passwort-Modus.

Meine aktuellen xml:

<EditText 
android:hint="@string/edt_password_hint"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:password="true"
android:singleLine="true" />
War es hilfreich?

Lösung

Ändern der Schriftart in xml funktionierte nicht auf dem Hinweistext für mich auch nicht. Ich fand zwei verschiedene Lösungen, von denen die zweiten besseres Verhalten für mich hat:

1) Remove android:inputType="textPassword" aus dem XML-Datei und stattdessen in Satz es in Java:

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

Mit diesem Ansatz der Hinweis Schriftart sieht gut aus, aber wie Sie schreiben in diesem Eingabefeld, das Sie nicht jedes Zeichen im Klartext, bevor es in ein Passwort Punkt dreht. Auch wenn im Vollbild, werden nicht die Punkte machen Eingang erscheinen, aber das Passwort im Klartext.

2) Leave android:inputType="textPassword" in Ihrem xml. In Java, setzen auch die Schriftart und passwordMethod:

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

Dieser Ansatz hat mich den Hinweis Schriftart ich wollte, und gibt mir das Verhalten, das ich mit dem Kennwort Punkten will.

Ich hoffe, das hilft!

Andere Tipps

Ich fand diesen nützlichen Tipp von Dialoge führen

  

Tipp: Standardmäßig, wenn Sie ein EditText Element stellen Sie den „textPassword“ Eingabetyp zu verwenden, wird die Schriftfamilie auf Monospace gesetzt, so dass man seine Schriftfamilie zu „sans-serif“ ändern sollte, so dass beiden Textfelder verwenden eine passende Schriftart.


Zum Beispiel

android:fontFamily="sans-serif"

Dies ist, was ich tat, um dieses Problem zu beheben. Aus irgendeinem Grund hatte ich die Transformationsmethode nicht so eingestellt, dass dies eine bessere Lösung sein kann:

In meinem xml:

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

In meinem Activity:

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

Die setTransformationMethod Ansatz bricht android: imeOption für mich, und ermöglicht Zeilenumbrüche in das Passwort-Feld eingegeben werden. Statt dessen ich tue:

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

Und Einstellung ist nicht android: Passwort = "true" in XML.

Die Antwort manisha vorgesehen funktioniert, aber es verläßt das Passwortfeld in einem Nicht-Standard-Zustand im Vergleich zum Standard. Das heißt, gilt das Standard-fontface dann auch das Passwort-Feld, einschließlich sowohl des Punktes Ersatz und die Vorschau Zeichen, die angezeigt wird, bevor sie mit den Punkten ersetzt werden (wie auch, wenn es ein „sichtbares Passwort“).

Um dies zu beheben, und es 1) Aussehen und wirken genau wie der Standard textPassword Eingabetyp, aber auch 2) ermöglicht es dem Hinweistext in einem Standard (nicht-monospace) Schriftart angezeigt werden soll, müssen Sie eine TextWatcher auf das haben, Feld, das die richtig fontface hin und her zwischen Typeface.DEFAULT und Typeface.MONOSPACE basierend darauf, ob sie leer ist oder nicht umschalten. Ich habe eine Hilfsklasse, die verwendet werden können, das zu erreichen:

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

Dann nutzen es, alles, was Sie tun müssen, ist die register(View) statische Methode aufrufen. Alles andere automatische ist (einschließlich der Abhilfe Überspringen, wenn die Ansicht es nicht erforderlich!):

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

Es gibt viele Wege zur Lösung dieses Problems, aber jede Art und Weise hat Vor- und Nachteile. Hier ist mein Test

ich nur Gesicht dieses Schriftart Problem in einem Gerät (Liste am Ende meiner Antwort), wenn der Eingang Passwort aktiviert, indem

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

Wenn ich android:inputType="textPassword", dieses Problem nicht passiert

Etwas, was ich habe versucht,

1) Verwendung setTransformationMethod statt inputType

edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
  • Font wird gut funktioniert
  • Tastatur Anzeige nicht sehr gut (nur Text angezeigt werden, werden nicht angezeigt Nummer oben auf Text)

2) Verwenden Sie Typeface.DEFAULT

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
  • Tastatur Display gut ,
  • Schrift kann gut funktioniert nicht . Beispiel sans-serif-light ist eine Standardschrift für alle View in meiner Anwendung => nach setTypeface(Typeface.DEFAULT), noch die EditText Schrift aussehen anders in einem Gerät

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

Meine Lösung

  

Cache die Schrift vor setInputType dann wieder verwenden

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

Testing
Einige Geräte Gesicht font Problem

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

Einige Gerät nicht mit dem Gesicht font Problem

  • Samsung S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Knoten 5 (5.1.1)
  • Samsung S7 Edge (SM-G935F) (7.0)

Die anderen Antworten sind die richtige Lösung für die meisten Fälle.

Wenn Sie jedoch eine benutzerdefinierte EditText Unterklasse zu verwenden, sagen wir, gelten eine eigene Schriftart standardmäßig gibt es eine subtile Frage. Wenn Sie die benutzerdefinierte Schriftart in den Konstruktor der Unterklasse gesetzt ist, wird es noch durch das System überschrieben werden, wenn Sie inputType="textPassword" gesetzt.

In diesem Fall bewegen Sie Ihren Styling onAttachedToWindow nach dem super.onAttachedToWindow Anruf.

Beispiel Implementierung:

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

Sie können auch eine benutzerdefinierte Widget verwenden. Es ist sehr einfach und es nicht Krempel Ihre Aktivität / Fragment-Code.

Hier ist der Code:

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

Und Ihre XML wird wie folgt aussehen:

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

Ich weiß, das die ältere sein kann, aber ich habe in etwas zu diesem Problem bucklige, wenn ich InputTypeand app:passwordToggleEnabled="true"together verwendet.

Also, schreibt dies, wie es jemand hier helfen kann.

Ich mag mein Passwort-Eingabefeld zusammen mit app:passwordToggleEnabled Option eine eigene Schriftart zu Passwort-Feld verwenden. Aber in 27.1.1 (beim Schreiben dieser) Support-Bibliothek wurde es abstürzt.

So ist der Code wie unten war,

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

Über Code nicht haben inputType in XML definiert

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

Und in Java, setTransformationMethod wird mir helfen, die Eigenschaften von textPassword input type erwerben und auch mein benutzerdefinierten Schriftstil Ich bin glücklich.

Aber der unten erwähnte Absturz geschah in allen API-Ebenen mit 27.1.1 Support-Bibliothek.

  

java.lang.NullPointerException: Der Versuch, virtuelle Methode aufzurufen ‚Leere   android.support.design.widget.CheckableImageButton.setChecked (boolean)‘   auf einer Null-Objekt Referenz

Dies wurde aufgrund der onRestoreInstanceState innen TextInputLayout Klasse abstürzt.

Nachgestalten Schritte: Toggle das Passwort Sichtbarkeit und minimieren Sie die App und offen von den zuletzt verwendeten Anwendungen. Uh, ho Crashed!

Alles, was ich benötigt wird, Standard-Passwort Toggle-Option (Support-Bibliothek) und benutzerdefinierte Schriftart in dem Passwort-Eingabefeld.

Nach einiger Zeit herausgefunden, indem sie als unten tun,

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

In XML hinzugefügt android:inputType="textPassword"

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

In über Java-Code,

Ich erwarb die benutzerdefinierte Schriftart aus Benutzername EditText und wendete sie des Passwortfeld TextInputLayout. Jetzt brauchen Sie nicht die Schriftart explizit auf das Passwort EditText zu setzen, wie es das TextInputLayout Eigentum erwerben.

Auch ich entfernt password.setTransformationMethod(new PasswordTransformationMethod());

Mit dem auf diese Weise tun, passwordToggleEnabled arbeitet, wird die benutzerdefinierte Schriftart auch angewandt und bye-bye zum Absturz. Die Hoffnung wird dieses Problem in der kommenden Support Versionen behoben werden.

Verwenden Sie die Kalligraphie Bibliothek .

dann noch pflegt es die Passwort-Felder mit der richtigen Schriftart aktualisieren. so tut dies in Code nicht in 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); 

ich die Fähigkeit zu ändern Toggle monospace on / off zu einer Erweiterung von EditText kürzlich hinzugefügt speziell für Passwörter es kann einige Menschen helfen. Dabei spielt es keine android:fontFamily verwenden, so ist kompatibel <16.

Sie können auch die

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

zusammen mit

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

Ich benutze diese Lösung, um die Schriftart zu wechseln je nach Hinweis Sichtbarkeit. Es ist ähnlich wie Joe Antwort, sondern erstreckt EditText statt:

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

}

Im Fall verwenden Sie die Kalligraphie Bibliothek in Kombination mit einem TextInputLayout und einem EditText, die folgenden Code funktioniert gut.

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

Ein seltsamer Fall vielleicht, aber ich habe mit diesem experimentiert und herausgefunden, dass:

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

geändert, um die Größe der Schrift des Hinweises statt der Schrift selbst! Dies ist immer noch eine unerwünschte Wirkung. Merkwürdigerweise der umgekehrte Vorgang:

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

Hält die gleiche Schriftgröße.

fand ich eine sichere Lösung für dieses Problem

Die beste Weg, um Hallo, ich habe eine sichere Lösung für dieses Problem

Der beste Weg ist es, eine individuelle editText und speichern Wert von Schrift als Aushilfe zu erstellen und dann die Methode auf die Input Änderungen zu übernehmen, schließlich setzen wir auf die editText den Wert der temporären Art Gesicht. etwa so:

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

}

Dies, wie eingegebene Passwort zu machen, die Andeutung hat, die nicht konvertierte * und Standard-Schriftart !!.

Ein XML:

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

Auf Aktivität:

inputPassword.setTypeface(Typeface.DEFAULT);

Dank an: Mango und rjrjr für den Einblick. D

wie die oben, aber stellen Sie sicher, dass die Felder nicht den kühnen Stil in xml haben, da sie nie das gleiche auch mit der oben fix aussehen werden!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top