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

前端 未结 4 921
傲寒
傲寒 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条回答
  • 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);
    
    0 讨论(0)
  • 2021-02-07 09:01

    You could set the text size to the smaller, desired value, then set a text listener to change the text size after some text is entered.

    0 讨论(0)
  • 2021-02-07 09:04

    You can set it in resource file.

    For example:

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

    And your XML:

    android:hint="@string/hint"
    
    0 讨论(0)
  • 2021-02-07 09:22

    The hint and the text are exclusive, if one of them is visible, the other one is not.

    Because of this, you could just change the attributes of your EditText depending on if it's empty (the hint is visible) or not (the text is visible).

    For example:

    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) {
        }
    });
    
    0 讨论(0)
提交回复
热议问题