Изменить шрифт для подсказки editText

Можно ли изменить шрифт для подсказки, отображаемой в поле EditText ? Я хочу установить шрифт в самом xml.

Это неправильный ответ на вопрос. Я попытался удалить, но не могу, кроме модераторов. Пожалуйста, игнорируйте ответ или не стесняйтесь обновлять ответ. Этот ответ вводит в заблуждение. Извини :).

 editText.setTypeface(Typeface.SERIF); 

Вы можете изменить шрифт EditText же, как TextView . Но вы не можете изменить шрифт hint .

Вы можете изменить его с помощью SpannableString и Custom TypefaceSpan.

Сначала создайте собственный класс TypefaceSpan:

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

Затем просто установите TypefaceSpan в SpannableString:

 TypefaceSpan typefaceSpan = new CustomTypefaceSpan(typeface); SpannableString spannableString = new SpannableString(hintText); spannableString.setSpan(typefaceSpan, 0, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 

И, наконец, просто установите намек на ваш EditText:

 mEditText.setHint(spannableString); 

Это очень простой способ сделать это. Я просто сделал это в своем приложении, и это сработало. Ключ установлен Facetype вашего TextInputLayout также вместе с 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))); 

Я могу изменить шрифт подсказки, используя эту библиотеку .

После компиляции библиотеки вы должны создать класс приложений и определение класса по следующей команде:

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

После каждого действия вы хотите переопределить его следующей командой:

 @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); } 

Его невозможно в XML –

Текст и подсказка могут иметь только один и тот же шрифт в XML.

Я не нашел полезного способа изменить шрифт подсказки в XML. Но вы можете добиться такого:

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

Ответ @ francisco_ssb правильный. Тем не менее, я предоставлю альтернативное решение, которое поможет изменить не только шрифт подсказки, но и его размер и стиль. Надеюсь, это решение будет полезно.

1) Создайте пользовательский объект Hint :

 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) Создайте собственный объект MetricAffectingSpan :

 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) Использование:

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