fonts ändern - Passwort Hinweis Schriftart in Android




vergrößern schriftgröße (13)

Wenn sich ein EditText im Passwortmodus befindet, scheint der Hinweis in einer anderen Schriftart angezeigt zu werden (Kurier?). Wie kann ich das vermeiden? Ich möchte, dass der Hinweis in der gleichen Schriftart angezeigt wird, wenn sich der EditText nicht im Passwortmodus 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" />

Answers

Wie oben, aber achte darauf, dass die Felder in xml nicht den fettgedruckten Stil haben, da sie selbst bei der oben genannten Lösung niemals gleich aussehen werden!


Falls Sie die Kalligrafie-Bibliothek 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);

Ich verwende diese Lösung, um den Typeface in Abhängigkeit von der Sichtbarkeit des Hinweises umzuschalten. Es ist ähnlich wie Joes Antwort, aber EditText wird stattdessen erweitert:

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

}

Ich habe kürzlich die Möglichkeit hinzugefügt, Monospace on / off zu einer Erweiterung von EditText speziell für Passwörter zu ändern, die einigen Leuten helfen kann. Es verwendet nicht android:fontFamily ist also kompatibel <16.


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

Wenn Sie jedoch eine benutzerdefinierte EditText Unterklasse verwenden, um z. B. eine benutzerdefinierte Schriftart standardmäßig anzuwenden, gibt es ein kleines Problem. Wenn Sie die benutzerdefinierte Schriftart im Konstruktor Ihrer Unterklasse inputType="textPassword" , wird sie immer noch vom System überschrieben, wenn Sie inputType="textPassword" .

In diesem Fall verschieben Sie Ihren onAttachedToWindow nach dem Aufruf von onAttachedToWindow super.onAttachedToWindow .

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

Die Antwort, die manisha zur Verfügung stellt, funktioniert zwar, aber das Passwort-Feld bleibt in einem Nicht-Standard-Zustand, verglichen mit dem Standard. Das heißt, das Standard-Fontface gilt dann auch für das Passwort-Feld, einschließlich sowohl der Punkt-Ersetzungen als auch der Vorschau-Zeichen, die erscheinen, bevor sie durch die Punkte ersetzt werden (sowie wenn es ein "sichtbares Passwort" -Feld ist).

Um dies zu beheben und 1) so aussehen zu lassen und zu textPassword , wie der voreingestellte Eingabeart textPassword , aber auch 2) den textPassword in einer Standardschriftart (Nicht-Monospace) erscheinen zu lassen, müssen Sie einen TextWatcher auf dem Feld haben, der dies kann Schalten Sie die Schriftart zwischen Typeface.DEFAULT und Typeface.MONOSPACE hin und her, je nachdem, ob sie leer ist oder nicht. Ich habe eine Hilfsklasse erstellt, mit der das 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://.com/questions/3406534/password-hint-font-in-android">http://.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 zu nutzen, müssen Sie lediglich die statische Methode register(View) aufrufen. Alles andere ist automatisch (einschließlich Überspringen der Problemumgehung, wenn die Ansicht dies nicht benötigt!):

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

Dies ist, was ich getan habe, um dieses Problem zu beheben. Aus irgendeinem Grund musste ich die Transformationsmethode nicht einstellen, daher könnte dies eine bessere Lösung sein:

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 meiner Activity :

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

Das Ändern der Schriftart in XML funktionierte auch nicht für den Hinweistext für mich. Ich habe zwei verschiedene Lösungen gefunden, von denen die zweite ein besseres Verhalten für mich hat:

1) Entferne android:inputType="textPassword" aus deiner XML-Datei und setze es stattdessen in Java:

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

Bei diesem Ansatz sieht die Tippschrift gut aus, aber wenn Sie in dieses Bearbeitungsfeld tippen, sehen Sie nicht jedes Zeichen im Klartext, bevor es zu einem Passwortpunkt wird. Wenn Sie die Eingabe im Vollbildmodus vornehmen, werden die Punkte nicht angezeigt, sondern das Passwort im Klartext.

2) Lassen Sie android:inputType="textPassword" in Ihrem XML. Setzen Sie in Java ALSO die Schriftart und passwordMethod:

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

Dieser Ansatz gab mir den Tipp-Schriftart, den ich wollte UND gibt mir das Verhalten, das ich mit dem Passwort dots will.

Ich hoffe, das hilft!


Ein merkwürdiger Fall vielleicht, aber ich habe damit experimentiert und herausgefunden, dass:

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

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

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

Hält die gleiche Schriftgröße.


Sie können auch die

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

zusammen mit

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

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

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 dein XML wird so 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" />

Dies ist wie Eingabe-Passwort zu machen, das einen Hinweis hat, der nicht in * und Standard-Schriftart konvertiert wurde !!

Auf XML:

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

Auf Aktivität:

inputPassword.setTypeface(Typeface.DEFAULT);

Danke an: Mango und Rjrjr für die Einsicht: D.


Ich bekomme auch den gleichen Fehler und ich habe eine Lösung folgen.

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf")

Sie müssen fonts/Molot.otf im Ordner " assets/fonts " in Eclipse fonts/Molot.otf .

nachdem Sie es ausführen können.

Wenn Sie es nicht erfolgreich ausführen können, können Sie perplem via senden





android fonts passwords android-edittext