Можно ли изменить шрифт для подсказки, отображаемой в поле EditText
? Я хочу установить шрифт в самом xml.
Изменить шрифт для editText hint
Ответ 1
Это неправильный ответ на вопрос. Я попытался удалить, но не могу, кроме модераторов. Пожалуйста, игнорируйте ответ или не стесняйтесь обновлять ответ. Этот ответ вводит в заблуждение. Извините:).
editText.setTypeface(Typeface.SERIF);
Вы можете изменить шрифт EditText
так же, как TextView
. Но вы не можете изменить шрифт hint
.
Ответ 2
Вы можете изменить его с помощью 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);
Ответ 3
Я не нашел полезного способа изменить шрифт подсказки в 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) {
}
});
Ответ 4
Существует очень простой способ сделать это. Я просто сделал это в своем приложении, и это сработало. Ключ также задает 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)));
Ответ 5
Я могу изменить шрифт подсказки, используя эту library.
После компиляции библиотеки вы должны создать класс приложений и определение класса по следующей команде:
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("font.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
После каждого действия, которое вы хотите переустановить, выполните следующую команду:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
Ответ 6
Ответ на@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);
Ответ 7
Его невозможно в XML -
Текст и подсказка могут иметь только один и тот же шрифт в XML.
Ответ 8
В Android 8.0 (уровень API 26) появилась новая функция, которая позволяет изменять шрифт текста в XML. Что еще можно даже изменить шрифт текстовой подсказки с предварительным просмотром. Больше информации здесь: Шрифты в XML
Ответ 9
В Android 8.0 (уровень API 26) появилась новая функция, которая позволяет менять шрифт в xml для подсказки, отображаемой в EditText. Руководство на основе шрифтов в XML.
шаги:
1) Создайте новый каталог ресурсов: щелкните правой кнопкой мыши по папке res и перейдите в New → Каталог ресурсов Android.
2) Установите имя каталога ресурсов в качестве шрифта.
3) В списке Тип ресурса выберите шрифт и нажмите кнопку ОК.
4) Добавьте свой собственный шрифт (например, my_font.ttf) в папку шрифтов.
5) В макете XML установите атрибут fontFamily в файл шрифта:
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/my_font"/>
... или если вы хотите сделать это программно:
val typeface = resources.getFont(R.font.my_font)
edit_text.typeface = typeface
Чтобы использовать функцию "Шрифты в XML" на устройствах под управлением Android 4.1 (уровень API 16) и выше, используйте библиотеку поддержки 26:
Примечание. Когда вы объявляете семейства шрифтов в макете XML через библиотеку поддержки, используйте пространство имен приложения, чтобы обеспечить загрузку шрифтов.
1) В каталоге шрифтов создайте 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) Установите атрибут fontFamily:
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/custom_font"/>
... или если вы хотите сделать это программно:
val typeface = ResourcesCompat.getFont(context, R.font.custom_font)
edit_text.typeface = typeface
Ответ 10
используйте этот код:
edittext.setAccentTypeface(typeface);