Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

change font for editText hint

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.

like image 317
Ankush Avatar asked Nov 06 '12 13:11

Ankush


People also ask

How do I change the hint font on my Android?

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.


7 Answers

You can change it with a SpannableString and a Custom TypefaceSpan.

First, create a Custom TypefaceSpan class:

public class CustomTypefaceSpan extends TypefaceSpan {
    private final Typeface mNewType;

    public CustomTypefaceSpan(Typeface type) {
        super("");
        mNewType = type;
    }

    public CustomTypefaceSpan(String family, Typeface type) {
        super(family);
        mNewType = type;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        applyCustomTypeFace(ds, mNewType);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        applyCustomTypeFace(paint, mNewType);
    }

    private static void applyCustomTypeFace(Paint paint, Typeface tf) {
        int oldStyle;
        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }

        int fake = oldStyle & ~tf.getStyle();
        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }

        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(tf);
    }
}

Then just set the TypefaceSpan to a SpannableString:

TypefaceSpan typefaceSpan = new CustomTypefaceSpan(typeface);
SpannableString spannableString = new SpannableString(hintText);

spannableString.setSpan(typefaceSpan, 0, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

And finally just set the hint of your EditText:

mEditText.setHint(spannableString);
like image 82
francisco_ssb Avatar answered Sep 30 '22 01:09

francisco_ssb


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) {
    }
});
like image 25
EmotionOF Avatar answered Oct 03 '22 01:10

EmotionOF


There is a very simple way to do it. I just did in my App and it worked. The Key is set Facetype of your TextInputLayout too along with EditText.

mEmailView.setTypeface(Typeface.createFromAsset(getAssets(), getString(R.string.app_font)));
((TextInputLayout) findViewById(R.id.tilEmail)).setTypeface(Typeface.createFromAsset(getAssets(), getString(R.string.app_font)));
like image 35
Akif Patel - BRMS Avatar answered Sep 30 '22 01:09

Akif Patel - BRMS


@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);
like image 37
Ayaz Alifov Avatar answered Oct 03 '22 01:10

Ayaz Alifov


Its not possible in XML -

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

like image 42
Sreeram Avatar answered Oct 02 '22 01:10

Sreeram


Take the approach of using a text input layout and placing a text input edit text inside

 <com.google.android.material.textfield.TextInputLayout
    android:id="@+id/text_input_layout_Til">

   <com.google.android.material.textfield.TextInputEditText
      android:id="@+id/editText"/>

 </com.google.android.material.textfield.TextInputLayout>

On the Fragment/Activity , Set the font you want for the hint onto the TextInputLayout(text_input_layout_Til) Then set the font on the edit text(editText) as well / If you do this , The text the user will input and the hint will have different fonts

like image 1
Yonko Kilasi Avatar answered Oct 02 '22 01:10

Yonko Kilasi


I can change the hint font by use this library .

After compiling the library you must create a class of applications and the class definition following command:

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                  .setDefaultFontPath("font.ttf")
                  .setFontAttrId(R.attr.fontPath)
                  .build()
          );

After each activity you want Override it with the following command:

@Override
      protected void attachBaseContext(Context newBase) {
          super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
      }
like image 2
HOSHYAR Ahmadpour Avatar answered Oct 04 '22 01:10

HOSHYAR Ahmadpour