change font for editText hint

后端 未结 10 2481
野趣味
野趣味 2020-12-03 13:17

Is it possible to change the font for the hint displayed in the EditText field? I want to set the font in the xml itself.

10条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-03 14:16

    @francisco_ssb's answer is correct. However, I will provide an alternative solution which helps to change not only a hint's font, but also its size and style. I hope this solution will be helpful.

    1) Create a custom Hint object:

    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) Create custom MetricAffectingSpan object:

    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) Use:

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

提交回复
热议问题