问题描述
有人试图改变浮动标签的字体?我改变的EditText的来源,但在浮动标签并没有改变的字体,我非常感谢那些谁帮我
Someone tried to change the font of the floating label? I changed the source of EditText but the font of the floating label did not change, I am very grateful to those who help me
code:
<android.support.design.widget.TextInputLayout
android:id="@+id/tilTextoDescricao"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/tilValorUnidade"
android:layout_marginTop="10dp">
<EditText
android:id="@+id/etTextoDescricao"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:hint="Descrição"
android:textSize="15dp"
android:inputType="text" />
</android.support.design.widget.TextInputLayout>
-----------------
etTextoDescricao= (EditText) findViewById(R.id.etTextoDescricao);
etTextoDescricao.setTypeface(CustomTypeface.getTypefaceMediumDefault(this));
推荐答案
不幸的是,你将不得不使用反射来处理这个问题。
Unfortunately, you'll have to use reflection to handle this.
浮动标签由 CollapsingTextHelper
,这是一个内部的,包私有类,而不是设置来处理跨绘制。因此,使用像自定义 TypefaceSpan
将不会在这种情况下工作。
The floating label is drawn by CollapsingTextHelper
, which is an internal, package-private class and isn't setup to handle spans. So, using something like a custom TypefaceSpan
won't work in this case.
由于这个使用反射,它不能保证在今后的工作。
Because this uses reflection, it isn't guaranteed to work in the future.
执行
final Typeface tf = Typeface.createFromAsset(getAssets(), "your_custom_font.ttf");
final TextInputLayout til = (TextInputLayout) findViewById(R.id.yourTextInputLayout);
til.getEditText().setTypeface(tf);
try {
// Retrieve the CollapsingTextHelper Field
final Field cthf = til.getClass().getDeclaredField("mCollapsingTextHelper");
cthf.setAccessible(true);
// Retrieve an instance of CollapsingTextHelper and its TextPaint
final Object cth = cthf.get(til);
final Field tpf = cth.getClass().getDeclaredField("mTextPaint");
tpf.setAccessible(true);
// Apply your Typeface to the CollapsingTextHelper TextPaint
((TextPaint) tpf.get(cth)).setTypeface(tf);
} catch (Exception ignored) {
// Nothing to do
}
错误观点
如果您需要更改错误的字体,你可以做两件事之一:
If you needed to change the font of the error, you could do one of two things:
- 使用反射抢误差
的TextView
并应用字样
就像前 - 使用自定义的范围。不像浮动标签,使用
TextInputLayout
错误观点仅仅是一个的TextView
,所以它能够处理跨越。
- Use Reflection grab the error
TextView
and apply theTypeface
much like before - Use a custom span. Unlike the floating label, the error view used by
TextInputLayout
is just aTextView
, so it's able to handle spans.
使用反射
final Field errorField = til.getClass().getDeclaredField("mErrorView");
errorField.setAccessible(true);
((TextView) errorField.get(til)).setTypeface(tf);
使用自定义范围
final SpannableString ss = new SpannableString("Error");
ss.setSpan(new FontSpan(tf), 0, ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
til.setError(ss);
private static final class FontSpan extends MetricAffectingSpan {
private final Typeface mNewFont;
private FontSpan(Typeface newFont) {
mNewFont = newFont;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setTypeface(mNewFont);
}
@Override
public void updateMeasureState(TextPaint paint) {
paint.setTypeface(mNewFont);
}
}
结果
我使用的字体是冰沙专柜。
这篇关于浮动标签的EditText和TextInputLayout变更字体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!