Thật không may, bạn sẽ phải để sử dụng sự phản chiếu để xử lý điều này.
Nhãn nổi được vẽ bởi CollapsingTextHelper
, là lớp nội bộ, gói riêng tư và không được thiết lập để xử lý các nhịp. Vì vậy, sử dụng một cái gì đó như một tùy chỉnh TypefaceSpan
sẽ không hoạt động trong trường hợp này.
Vì điều này sử dụng sự phản chiếu nên không đảm bảo hoạt động trong tương lai.
Thực hiện
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
}
xem Lỗi
Nếu bạn cần thay đổi font chữ của lỗi, bạn có thể làm một trong hai điều:
- Sử dụng Reflection lấy lỗi
TextView
và áp dụng Typeface
giống như trước
- Sử dụng khoảng tùy chỉnh. Không giống như nhãn nổi, chế độ xem lỗi được sử dụng bởi
TextInputLayout
chỉ là một TextView
, do đó, nó có thể xử lý các nhịp.
Sử dụng phản ánh
final Field errorField = til.getClass().getDeclaredField("mErrorView");
errorField.setAccessible(true);
((TextView) errorField.get(til)).setTypeface(tf);
Sử dụng một khoảng tùy chỉnh
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);
}
}
Kết quả
Phông chữ tôi đang sử dụng là Smoothie Shoppe.
Không đẹp, nhưng siêu hữu ích cho bây giờ, cảm ơn! – StingRay5
Xin Chúa ban phước cho bạn! Lưu tôi –
Làm thế nào tôi có thể sử dụng điều này trong lớp đơn, vấn đề của tôi là tôi có rất nhiều bố cục sau đó tất cả các thời gian tôi phải sử dụng mã này trong tất cả các lớp đó là lý do tại sao tôi đang ask.Is nó có thể? –