Passwort Hinweis Schriftart in Android

255

Wenn sich ein EditText im Kennwortmodus befindet, wird der Hinweis anscheinend in einer anderen Schriftart angezeigt (Courrier?). Wie kann ich das vermeiden? Ich möchte, dass der Hinweis in derselben Schriftart angezeigt wird, in der sich der EditText nicht im Kennwortmodus befindet.

Meine aktuelle XML:

<EditText 
android:hint="@string/edt_password_hint"
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:password="true"
android:singleLine="true" />
hpique
quelle
1
Beachten Sie, dass sich nicht alle Geräte so verhalten. Das "HTC One X @ 4.1.1" funktioniert (Monospace). Das "Samsung GT-7510 @ 4.0.4" nicht. (gleiche Schriftart)
Loda
1
Gleiches Verhalten unter LeWa OS 4.2.2. Zu inkonsistent API ..
ruX
existiert auch noch im Lutscher
Mightian
Sie können meine Antwort hier überprüfen , hoffe, es funktioniert.
Dmila Ram

Antworten:

394

Das Ändern der Schrift in XML funktionierte auch für mich nicht im Hinweistext. Ich habe zwei verschiedene Lösungen gefunden, von denen die zweite für mich besser ist:

1) Entfernen Sie android:inputType="textPassword"aus Ihrer XML-Datei und setzen Sie sie stattdessen in Java:

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

Bei diesem Ansatz sieht die Hinweisschrift gut aus, aber während Sie in dieses Bearbeitungsfeld eingeben, sehen Sie nicht jedes Zeichen im Klartext, bevor es zu einem Kennwortpunkt wird. Auch bei der Eingabe im Vollbildmodus werden nicht die Punkte angezeigt, sondern das Kennwort im Klartext.

2) Lassen Sie android:inputType="textPassword"in Ihrer XML. Legen Sie in Java AUCH die Schriftart und die Kennwortmethode fest:

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

Dieser Ansatz gab mir die gewünschte Hinweisschrift UND gab mir das gewünschte Verhalten mit den Passwortpunkten.

Hoffentlich hilft das!

Manisha
quelle
3
Großartig, dies ist ein seltsames Verhalten, das Sie von der Standardeinstellung nicht erwarten würden!
Sander Versluys
15
Ist das password.setTransformationMethod(new PasswordTransformationMethod());nötig? Scheint für mich ohne gut zu funktionieren.
Loeschg
1
Ich musste das auch nicht benutzen setTransformationMethod(). Es gibt jedoch einige Nebenwirkungen dieses Ansatzes, die ihn unerwünscht machen, da er im Vergleich zum Standardverhalten zu einem nicht standardmäßigen textPasswordVerhalten führt. Eine vollständigere Lösung finden Sie in der Hilfsklasse unter
Joe
10
Besser noch, schauen Sie sich diese großartige einfache Lösung in einer Antwort direkt auf dieser Seite an: stackoverflow.com/a/18073897
Marcin Koziński
16
Bitte beachten Sie, dass die Verwendung der ersten Lösung eine schlechte Idee ist. Benutzer, für die die automatische Empfehlung aktiviert ist, sehen ihr Kennwort in anderen Apps, die ihnen vorgeschlagen wurden, da der EditText nicht alsinputType="textPassword"
Elad Nava
193

Ich habe diesen nützlichen Tipp im Dialogs Guide gefunden

Tipp: Wenn Sie ein EditText-Element für die Verwendung des Eingabetyps "textPassword" festlegen, wird die Schriftfamilie standardmäßig auf "monospace" gesetzt. Sie sollten daher die Schriftfamilie in "serifenlos" ändern, damit beide Textfelder eine übereinstimmende Schriftart verwenden Stil.


Beispielsweise

android:fontFamily="sans-serif"
aysonje
quelle
21
Dies sollte die akzeptierte Antwort sein. Es ist einfacher und stammt aus den Dokumenten.
Marcin Koziński
29
Es ist gut, außer dass es nur auf API Level 16 und höher funktioniert
Ben Clayton
6
Beachten Sie, dass XML-Attribute zwar nur auf API-Ebene 16 und höher funktionieren, auf älteren Geräten jedoch keine Abstürze verursachen, sondern nur ignoriert werden.
Adam Johns
Es wird nicht funktionieren, wenn Sie mehrmals auf Passwort
ein-
32

Dies ist, was ich getan habe, um dieses Problem zu beheben. Aus irgendeinem Grund musste ich die Transformationsmethode nicht festlegen, damit dies eine bessere Lösung ist:

In meiner 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 );
James McCracken
quelle
Ich habe es gerade mit textPassword in XML versucht und wie Sie es in der .java-Datei getan haben, und es hat gut funktioniert. Für mich schien es die Transformation nicht zu brauchen
Joe Plante
2
Erinnerung: Rufen Sie setTypeface () auf, nachdem Sie den InputType per Code geändert haben. setTransformationMethod wird nicht benötigt, wenn InputType xx_VARIATION_PASSWORD enthält;
Loda
21

Der setTransformationMethod-Ansatz unterbricht android: imeOption für mich und ermöglicht die Eingabe von Wagenrückläufen in das Kennwortfeld. Stattdessen mache ich das:

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

Und setze nicht android: password = "true" in XML.

rjrjr
quelle
Ja, das hat auch in 6.0.1 für mich funktioniert, die gewählte Antwort nicht
Nactus
5

Die von manisha bereitgestellte Antwort funktioniert zwar, lässt das Kennwortfeld jedoch im Vergleich zum Standard in einem nicht standardmäßigen Zustand. Das heißt, die Standardschriftart gilt dann auch für das Kennwortfeld, einschließlich der Punktersetzungen und der Vorschauzeichen, die angezeigt werden, bevor sie durch die Punkte ersetzt werden (sowie wenn es sich um ein "sichtbares Kennwort" -Feld handelt).

Um dies zu beheben und es 1) genau wie den Standardeingabetyp aussehen und verhalten zu lassen textPassword, aber auch 2) den Hinweistext in einer Standardschriftart (nicht Monospace) erscheinen zu lassen, muss ein TextWatcherFeld vorhanden sein, mit dem das umgeschaltet werden kann Schriftart richtig hin und her zwischen Typeface.DEFAULTund Typeface.MONOSPACEbasierend darauf, ob es leer ist oder nicht. Ich habe eine Hilfsklasse erstellt, mit der dies erreicht werden kann:

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

Um es dann zu nutzen, müssen Sie nur die register(View)statische Methode aufrufen . Alles andere erfolgt automatisch (einschließlich des Überspringens der Problemumgehung, wenn die Ansicht dies nicht erfordert!):

    final EditText txtPassword = (EditText) view.findViewById(R.id.txt_password);
    PasswordFontfaceWatcher.register(txtPassword);
Joe
quelle
1
Gute Arbeit. Eine kleine Änderung: Wenn Sie eine Schriftart auf festlegen EditText(z. B. den Hinweistext Roboto Light erstellen), Typeface.DEFAULTwird diese durch eine spätere Einstellung überschrieben. Ich rufe field.getTypeface()von vorne an und verwende diese Schrift, wenn ich später auf die "Standard" -Schrift zurücksetzen muss.
Christopher Orr
Nun, das Anrufen field.getTypeface()scheint nicht 100% zuverlässig zu sein (so oft erhalten Sie nur die Monospace-Schrift zurück), aber das Erstellen einer Schriftart über Typeface.create()und das anschließende Einstellen, das gut zu funktionieren scheint.
Christopher Orr
5

Es gibt viele Möglichkeiten, dieses Problem zu lösen, aber jede hat Vor- und Nachteile. Hier ist meine Prüfung

Ich nur Gesicht diesem Schriftart Problems in einem Gerät (Liste am Ende meiner Antwort) , wenn der Eingang Passwort aktivieren , indem Sie

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

Wenn ich benutze android:inputType="textPassword", ist dieses Problem nicht aufgetreten

Etwas, das ich versucht habe

1) Verwenden Sie setTransformationMethodstattdesseninputType

edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
  • Die Schrift funktioniert gut
  • Tastaturanzeige nicht sehr gut (es wird nur Text angezeigt, keine Nummer über dem Text)

2) Verwenden Typeface.DEFAULT

setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
setTypeface(Typeface.DEFAULT);
  • Tastaturanzeige gut ,
  • Die Schrift funktioniert möglicherweise nicht gut . Beispiel sans-serif-lightist eine Standardschriftart für alle Viewin meiner Anwendung => danach sieht setTypeface(Typeface.DEFAULT)die EditTextSchriftart auf einigen Geräten immer noch anders aus

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

MEINE LÖSUNG

Zwischenspeichern Sie die Schriftart, bevor Sie sie setInputTypewiederverwenden

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

Testen
Einige Probleme mit der Schriftart des Geräts

  • 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äte haben keine Probleme mit der Schriftart

  • Samsung S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Node 5 (5.1.1)
  • Samsung S7 Edge (SM-G935F) (7.0)
Phan Van Linh
quelle
Was ist das Gerät (Name und Betriebssystem)?
CoolMind
1
@ CoolMind danke für Ihren Vorschlag, ich habe Update Gerät Gesicht Schriftart Problem und Gerät nicht Gesicht Schriftart Problem Basis auf meinem aktuellen Gerät
Phan Van Linh
Vielen Dank für einen großen Test! Ich kam von stackoverflow.com/a/52178340/2914140 . Auf dem Samsung S4 habe ich die setTransformationMethodMethode verwendet (wo kein Problem aufgetreten ist).
CoolMind
Wie ich in meiner Antwort erwähne, setTransformationMethodfunktioniert es, aber die Tastatur wird nicht gut angezeigt. Wenn Sie jedoch damit okken, ist es immer noch ok, weil es nur ein kleines Problem ist
Phan Van Linh
4

Die anderen Antworten sind in den meisten Fällen die richtige Lösung.

Wenn Sie jedoch eine benutzerdefinierte EditTextUnterklasse verwenden, um beispielsweise standardmäßig eine benutzerdefinierte Schriftart anzuwenden, liegt ein subtiles Problem vor. Wenn Sie die benutzerdefinierte Schriftart im Konstruktor Ihrer Unterklasse festlegen, wird sie vom System weiterhin überschrieben, wenn Sie sie festlegen inputType="textPassword".

In diesem Fall verschieben Sie Ihr Styling onAttachedToWindownach Ihrem super.onAttachedToWindowAnruf auf.

Beispielimplementierung:

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 [email protected]
 */
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()));
        }
    }
}
Cory Petosky
quelle
3

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

Schreiben Sie dies, da es jemandem hier helfen kann.

Ich möchte ein benutzerdefiniertes Feld app:passwordToggleEnabledfür die Schriftart zum Kennwort zusammen mit der Option für mein Kennworteingabefeld verwenden. In der Unterstützungsbibliothek 27.1.1 (während des Schreibens) stürzte sie jedoch ab.

Der Code war also wie folgt:

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

Der obige Code wurde nicht inputTypein XML definiert

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

Und in Java setTransformationMethodwird mir helfen, die Eigenschaften des textPasswordEingabetyps zu erlangen, und ich bin auch glücklich über meinen benutzerdefinierten Schriftstil.

Der unten erwähnte Absturz ereignete sich jedoch in allen API-Ebenen mit der 27.1.1-Unterstützungsbibliothek.

java.lang.NullPointerException: Versuch, die virtuelle Methode 'void android.support.design.widget.CheckableImageButton.setChecked (boolean)' für eine Nullobjektreferenz aufzurufen

Dies stürzte aufgrund der onRestoreInstanceStateinneren TextInputLayoutKlasse ab.

Schritte zum Reproduzieren: Schalten Sie die Kennwortsichtbarkeit um, minimieren Sie die App und öffnen Sie sie über die letzten Apps. Äh, ho abgestürzt!

Alles, was ich brauchte, war die Standardoption zum Umschalten des Passworts (mithilfe der Support-Bibliothek) und die benutzerdefinierte Schriftart im Passwort-Eingabefeld.

Nach einiger Zeit, wie unten herausgefunden,

<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

Im obigen Java-Code

Ich habe die benutzerdefinierte Schriftart vom Benutzernamen erhalten EditTextund auf TextInputLayoutdas Kennwortfeld angewendet . Jetzt müssen Sie die Schriftart nicht explizit auf das Kennwort festlegen, EditTextda sie die TextInputLayoutEigenschaft erhält .

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

Auf diese Weise passwordToggleEnabledfunktioniert, wird auch die benutzerdefinierte Schriftart angewendet und tschüss auf den Absturz. Ich hoffe, dieses Problem wird in den kommenden Support-Versionen behoben.

Kavin Prabhu
quelle
2

Sie können auch ein benutzerdefiniertes Widget verwenden. Es ist sehr einfach und überfrachtet Ihren Aktivitäts- / Fragmentcode nicht.

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 Ihr XML sieht folgendermaßen aus:

<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" />
Aldo Borrero
quelle
Nach meiner Erfahrung funktioniert dies nicht - TextViewscheint intern die benutzerdefinierte Schriftart nach dem Konstruktoraufruf zu überschreiben. Eine Problemumgehung in einer anderen Antwort bereitgestellt.
Cory Petosky
2

Verwenden Sie die Kalligraphiebibliothek .

Dann werden die Kennwortfelder immer noch nicht mit der richtigen Schriftart aktualisiert. Tun Sie dies im 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); 
j2emanue
quelle
0

Ich habe kürzlich die Möglichkeit hinzugefügt, das Ein- und Ausschalten von Monospace in eine Erweiterung von EditText zu ändern, die speziell für Kennwörter vorgesehen ist, die einigen Benutzern möglicherweise helfen. Es wird nicht verwendet android:fontFamily, ist also kompatibel <16.

Scottyab
quelle
0

Sie können auch die verwenden

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

zusammen mit

<android.support.v7.widget.AppCompatEditText/>
DoruChidean
quelle
0

Ich verwende diese Lösung, um die Schrift abhängig von der Sichtbarkeit der Hinweise umzuschalten. Es ähnelt Joes Antwort, erweitert jedoch stattdessen EditText:

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

}
KTCO
quelle
0

Wenn Sie die Kalligraphiebibliothek in Kombination mit einem TextInputLayout und einem EditText verwenden, funktioniert der folgende Code 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);
Philipp Hellmayr
quelle
Dies hat meine Hinweisschrift nicht geändert
Rafael Ruiz Muñoz
0

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

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

hat die Größe der Schriftart des Hinweises anstelle der Schriftart selbst geändert ! Dies ist immer noch ein unerwünschter Effekt. Seltsamerweise ist die umgekehrte Operation:

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

Behält die gleiche Schriftgröße bei.

MPelletier
quelle
0

Ich habe eine sichere Lösung für dieses Problem gefunden

Der beste Weg zu Hallo, ich habe eine sichere Lösung für dieses Problem gefunden

Der beste Weg ist, einen benutzerdefinierten editText zu erstellen und den Wert der Schriftart als temporär zu speichern und dann die Methode auf die InputType-Änderungen anzuwenden. Schließlich setzen wir den Wert der temporären Schriftart auf den editText zurück. wie 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);
        }
    }

}
Herr Hosseini
quelle
-1

So erstellen Sie ein Eingabekennwort mit einem Hinweis, der nicht in * konvertiert wurde, und eine Standardschrift !!.

Auf XML:

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

Über Aktivität:

inputPassword.setTypeface(Typeface.DEFAULT);

danke an: mango und rjrjr für den einblick: d.

Bhimbim
quelle
-2

wie oben, aber stellen Sie sicher, dass die Felder nicht den fett gedruckten Stil in XML haben, da sie selbst mit dem obigen Fix niemals gleich aussehen werden!

Dori
quelle
2
Sag nicht "oben" ... die Dinge ändern sich im Laufe der Zeit :-)
ZaBlanc