change font for editText hint

后端 未结 10 2134
野趣味
野趣味 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

    I haven't find out any useful way to change hint font in XML.But you can achieve like this:

    mEt.addTextChangedListener(new TextWatcher() {
        @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) {
                //mEt.setTypeFace(normalFont);
            }else{
               // mEt.setTypeFace(hintFont);
            }
        }
    
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    
    0 讨论(0)
  • 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);
    
    0 讨论(0)
  • 2020-12-03 14:17

    Its not possible in XML -

    Text and hint can only have the same font in XML.

    0 讨论(0)
  • 2020-12-03 14:20

    With Android 8.0 (API level 26) comes a new feature that gives a possibility to change font in xml for the hint displayed in the EditText. Guide based on Fonts in XML.

    Steps:

    1) Create a new resource directory: right-click the res folder and go to New -> Android resource directory.

    2) Set name of resource directory as font.

    3) In the Resource type list, select font, and then click OK.

    4) Add your custom font(e.g. my_font.ttf) in the font folder.

    5) In the layout XML, set the fontFamily attribute to the font file:

    <EditText
        android:id="@+id/edit_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/my_font"/>
    

    ... or if you want to do it programmatically:

    val typeface = resources.getFont(R.font.my_font)
    edit_text.typeface = typeface
    

    To use the Fonts in XML feature on devices running Android 4.1 (API level 16) and higher, use the Support Library 26:

    Note: When you declare font families in XML layout through the support library, use the app namespace to ensure your fonts load.

    1) In font directory create custom_font.xml

    <?xml version="1.0" encoding="utf-8"?>
    <font-family xmlns:app="http://schemas.android.com/apk/res-auto">
        <font app:fontStyle="normal" app:fontWeight="400" app:font="@font/my_font"/>
    </font-family>
    

    2) Set the fontFamily attribute:

     <EditText
        android:id="@+id/edit_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/custom_font"/>
    

    ... or if you want to do it programmatically:

    val typeface = ResourcesCompat.getFont(context, R.font.custom_font)
    edit_text.typeface = typeface
    
    0 讨论(0)
提交回复
热议问题