How to change hint text size without changing the text size in EditText

前端 未结 4 960
傲寒
傲寒 2021-02-07 08:23

I have a EditText input field. I have added a hint in it. Now i want to change the size of hint text, but when i do this, it also effects the size of the text. Kind

4条回答
  •  萌比男神i
    2021-02-07 08:59

    Using HTML is ok, but it is not flexible. For example, you cannot set the exact size. I will provide an alternative solution where you can set:

    • new Hint font
    • new Hint size
    • new Hint style

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

提交回复
热议问题