Purtroppo, dovrete usare la riflessione per gestire questo.
L'etichetta mobile viene disegnata da CollapsingTextHelper
, che è una classe interna, pacchetto-privata e non è impostata per gestire gli span. Quindi, usare qualcosa come una custom TypefaceSpan
non funzionerà in questo caso.
Poiché ciò utilizza la riflessione, non è garantito che funzioni in futuro.
Attuazione
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
}
vista Errore
Se avete bisogno di cambiare il tipo di carattere dell'errore, si potrebbe fare una delle due cose:
- utilizzare la riflessione grab l'errore
TextView
e applicare lo Typeface
molto prima dello
- Utilizzare uno span personalizzato. A differenza dell'etichetta mobile, la vista di errore utilizzata da
TextInputLayout
è solo una TextView
, quindi è in grado di gestire le estensioni.
Utilizzando riflessione
final Field errorField = til.getClass().getDeclaredField("mErrorView");
errorField.setAccessible(true);
((TextView) errorField.get(til)).setTypeface(tf);
Utilizzando un arco personalizzato
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);
}
}
Risultati
Il carattere che sto utilizzando è Smoothie Shoppe.
Non bella, ma super utile per ora, grazie! – StingRay5
Dio ti benedica! Salvato me –
Come posso usarlo in classe singola, il mio problema è che ho così tanti layout, quindi tutto il tempo che devo usare questo codice in tutte le classi è per questo che sto chiedendo. È possibile? –