web-dev-qa-db-fra.com

Comment changer la taille du texte sans changer la taille du texte dans EditText

J'ai un champ de saisie EditText. J'ai ajouté un indice dans celui-ci. Maintenant, je veux changer la taille du texte d'aide, mais quand je fais cela, cela affecte également la taille du texte. Veuillez m'indiquer comment modifier la taille du conseil et du texte séparément, et attribuer des polices différentes au conseil et au texte.

<EditText
    Android:layout_width="0dp"
    Android:layout_height="50dp"
    Android:layout_weight="1"
    Android:textSize="12sp"
    Android:textColor="#ffffff"                            
    Android:fontFamily="sans-serif-light"
    Android:hint="MM/YY"
    Android:textColorHint="@color/white" />  
5
Kirmani88

L'indice et le texte sont exclusifs, si l'un d'eux est visible, l'autre ne l'est pas.

De ce fait, vous pouvez simplement modifier les attributs de votre EditText en fonction de son caractère vide (l'indice est visible) ou non (le texte est visible).

Par exemple:

final EditText editText = (EditText) findViewById(R.id.yourEditText);

editText.addTextChangedListener(new TextWatcher() {
    boolean hint;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(s.length() == 0) {
            // no text, hint is visible
            hint = true;
            editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
            editText.setTypeface(Typeface.createFromAsset(getAssets(),
                "hintFont.ttf")); // setting the font
        } else if(hint) {
            // no hint, text is visible
            hint = false;
            editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
            editText.setTypeface(Typeface.createFromAsset(getAssets(),
                "textFont.ttf")); // setting the font
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});
7
earthw0rmjim

Vous pouvez le définir dans un fichier de ressources.

Par exemple:

<string name="hint"><font size="20">Hint!</font></string>

Et votre XML:

Android:hint="@string/hint"
22
Filip Rosca

Vous pouvez définir la taille du texte sur la valeur souhaitée la plus petite, puis définir un programme d'écoute de texte pour modifier la taille du texte après la saisie de texte.

1
Jesse Buss

L'utilisation de HTML est acceptable, mais non flexible. Par exemple, vous ne pouvez pas définir la taille exacte. Je vais fournir une solution alternative où vous pouvez définir:

  • nouvelle police Hint
  • nouvelle taille 
  • nouveau style Hint

1) Créez un objet Hint personnalisé:

import Android.graphics.Typeface;
import Android.text.SpannableString;
import Android.text.Spanned;
import Android.text.style.MetricAffectingSpan;

public class CustomHint extends SpannableString
{
    public CustomHint(final CharSequence source, final int style)
    {
        this(null, source, style, null);
    }

    public CustomHint(final CharSequence source, final Float size)
    {
        this(null, source, size);
    }

    public CustomHint(final CharSequence source, final int style, final Float size)
    {
        this(null, source, style, size);
    }

    public CustomHint(final Typeface typeface, final CharSequence source, final int style)
    {
        this(typeface, source, style, null);
    }

    public CustomHint(final Typeface typeface, final CharSequence source, final Float size)
    {
        this(typeface, source, null, size);
    }

    public CustomHint(final Typeface typeface, final CharSequence source, final Integer style, final Float size)
    {
        super(source);

        MetricAffectingSpan typefaceSpan = new CustomMetricAffectingSpan(typeface, style, size);
        setSpan(typefaceSpan, 0, source.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    }
}

2) Créer un objet MetricAffectingSpan personnalisé:

import Android.graphics.Typeface;
import Android.text.TextPaint;
import Android.text.style.MetricAffectingSpan;

public class CustomMetricAffectingSpan extends MetricAffectingSpan
{
    private final Typeface _typeface;
    private final Float    _newSize;
    private final Integer  _newStyle;

    public CustomMetricAffectingSpan(Float size)
    {
        this(null, null, size);
    }

    public CustomMetricAffectingSpan(Float size, Integer style)
    {
        this(null, style, size);
    }

    public CustomMetricAffectingSpan(Typeface type, Integer style, Float size)
    {
        this._typeface = type;
        this._newStyle = style;
        this._newSize = size;
    }

    @Override
    public void updateDrawState(TextPaint ds)
    {
        applyNewSize(ds);
    }

    @Override
    public void updateMeasureState(TextPaint Paint)
    {
        applyNewSize(Paint);
    }

    private void applyNewSize(TextPaint Paint)
    {
        if (this._newStyle != null)
            Paint.setTypeface(Typeface.create(this._typeface, this._newStyle));
        else
            Paint.setTypeface(this._typeface);

        if (this._newSize != null)
            Paint.setTextSize(this._newSize);
    }
}

3) Utilisation:

Typeface newTypeface = Typeface.createFromAsset(getAssets(), "AguafinaScript-Regular.ttf");
CustomHint customHint = new CustomHint(newTypeface, "Enter some text", Typeface.BOLD_ITALIC, 60f);
        //        CustomHint customHint = new CustomHint(newTypeface, "Enter some text", Typeface.BOLD_ITALIC);
        //        CustomHint customHint = new CustomHint(newTypeface, "Enter some text", 60f);
        //        CustomHint customHint = new CustomHint("Enter some text", Typeface.BOLD_ITALIC, 60f);
        //        CustomHint customHint = new CustomHint("Enter some text", Typeface.BOLD_ITALIC);
        //        CustomHint customHint = new CustomHint("Enter some text", 60f);

customEditText.setHint(customHint);
1
Sa Qada