对于EDITTEXT提示更换字体(change font for editText hint)

2019-07-03 15:06发布

是否有可能改变在显示的提示字体EditText场? 我想设置在XML本身的字体。

Answer 1:

这是一个错误的问题的答案。 我试着删除,但我不能,除了主持人。 请忽略答案或随时更新的答案。 这个答案是误导性的。 对不起:)。

editText.setTypeface(Typeface.SERIF);

您可以更改字体EditText就像TextView 。 但是你不能改变的字体hint



Answer 2:

你可以用SpannableString和自定义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);


Answer 3:

我还没有找到改变提示的字体在XML.But就可以实现这样的任何有用的方法:

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


Answer 4:

有一个很简单的方法来做到这一点。 我只是在我的应用程序没有和它的工作。 关键是有太多的EditText沿着设定TextInputLayout的Facetype。

mEmailView.setTypeface(Typeface.createFromAsset(getAssets(), getString(R.string.app_font)));
((TextInputLayout) findViewById(R.id.tilEmail)).setTypeface(Typeface.createFromAsset(getAssets(), getString(R.string.app_font)));


Answer 5:

我可以使用这个更改的提示字体库 。

编译库后,你必须创建一个类的应用程序和下面的命令类的定义:

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

每次活动后,您需要使用以下命令将其覆盖:

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


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


Answer 7:

它不可能在XML -

文本和提示只能在XML中有相同的字体。



Answer 8:

借助Android 8.0(API级别26)提供了一个新的功能,给出了一个可能改变字体在XML在显示的EditText的提示。 根据指南中的XML字体 。

脚步:

1)创建一个新的资源目录:右键单击res文件夹,然后转到新建- > 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


Answer 9:

以使用文本输入的布局和放置一个文本输入编辑文本内的方法

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

在片段/活动,设置所需的提示到TextInputLayout(text_input_layout_Til)字体然后设置上编辑文本(EDITTEXT)字体以及/如果你这样做,文本,用户将输入和提示将有不同的字体



Answer 10:

使用此代码:

edittext.setAccentTypeface(typeface);


文章来源: change font for editText hint