Cambiar fuente de la etiqueta flotante EditText y TextInputLayout
Alguien ha intentado cambiar la fuente de la etiqueta flotante? Cambié la fuente de EditText, pero la fuente de la etiqueta flotante no cambió, estoy muy agradecido a aquellos que me ayudan
Código:
- Teclado suave se abre y luego se cierra al hacer clic en edittext
- Android edittext onchange escucha
- No obtener el botón "Ir" en el teclado de Android
- Cómo cambiar el color de etiqueta flotante de TextInputLayout
- Color de sugerencia TextInputLayout
<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));
- Android EditText fuerza el teclado numérico pero permite caracteres no numéricos
- android: inputType, textCapWords después de textCapCharacters no funciona
- Cómo aplicar estilo personalizado global a android.support.design.widget.TextInputEditText?
- Android - Hacer algo * después de * texto se cambia en EditText
- Cómo deshabilitar el botón "Siguiente" en un teclado del software EditText (reemplazar con el botón "Listo")
- Android: Redimensionar sólo partes de la vista con el teclado suave en la pantalla
- ¿Cómo implementar un simple método de resaltado de sintaxis para edittext?
- Android- ¿Cómo puedo mostrar la selección de texto en textview?
A partir de Design Library v23
, puede utilizar TextInputLayout#setTypeface()
.
Esto establecerá el tipo de letra en la sugerencia expandida y flotante.
Aquí está la solicitud de característica donde fue discutido en b.android.com .
EDIT: El tipo de letra de vista de error no se estaba estableciendo, pero ahora se ha corregido en v25.1.0
.
Por desgracia, tendrás que usar la reflexión para manejar esto.
La etiqueta flotante es dibujada por CollapsingTextHelper
, que es una clase interna privada de paquete y no está configurada para manejar spans. Por lo tanto, usar algo como un TypefaceSpan
personalizado no funcionará en este caso.
Debido a que esto utiliza la reflexión, no se garantiza que funcione en el futuro.
Implementació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 }
Vista de error
Si necesita cambiar la fuente del error, puede hacer una de dos cosas:
- Use la reflexión agarre el
TextView
error y aplique elTypeface
como antes - Utilice un intervalo personalizado. A diferencia de la etiqueta flotante, la vista de error utilizada por
TextInputLayout
es sólo unTextView
, por lo que es capaz de manejar spans.
Uso de la reflexión
final Field errorField = til.getClass().getDeclaredField("mErrorView"); errorField.setAccessible(true); ((TextView) errorField.get(til)).setTypeface(tf);
Uso de un span personalizado
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); } }
Resultados
La fuente que estoy usando es Smoothie Shoppe .
Esta es una implementación de clase personalizada para la respuesta de adneal .
public class CustomTextInputLayout extends TextInputLayout { public CustomTextInputLayout(Context context) { super(context); initFont(context); } public CustomTextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); initFont(context); } private void initFont(Context context) { final Typeface typeface = Typeface.createFromAsset( context.getAssets(), "fonts/YOUR_CUSTOM_FONT.ttf"); EditText editText = getEditText(); if (editText != null) { editText.setTypeface(typeface); } try { // Retrieve the CollapsingTextHelper Field final Field cthf = TextInputLayout.class.getDeclaredField("mCollapsingTextHelper"); cthf.setAccessible(true); // Retrieve an instance of CollapsingTextHelper and its TextPaint final Object cth = cthf.get(this); final Field tpf = cth.getClass().getDeclaredField("mTextPaint"); tpf.setAccessible(true); // Apply your Typeface to the CollapsingTextHelper TextPaint ((TextPaint) tpf.get(cth)).setTypeface(typeface); } catch (Exception ignored) { // Nothing to do } } }
En sus archivos XML ahora necesita utilizar CustomTextInputLayout
lugar de TextInputLayout
y funcionará fuera de la caja.
<your.package.CustomTextInputLayout android:id="@+id/textInputLayout_email" android:layout_width="match_parent" android:layout_height="wrap_content" > <AutoCompleteTextView android:id="@+id/editText_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_email" android:inputType="textEmailAddress" />
Gracias adneal por la respuesta.
Acabo de encontrar una solución simple y ha funcionado para mí:
De esta manera puede configurar el tipo de letra para sugerir cualquier texto de edición:
En layout.xml:
<android.support.design.widget.TextInputLayout android:id="@+id/text_input1" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/edt_user" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/username"/> </android.support.design.widget.TextInputLayout>
Y en la clase java:
public class MainActivity extends AppCompatActivity { EditText editText; TextInputLayout textInputLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Typeface font_yekan= Typeface.createFromAsset(getAssets(), "fonts/byekan.ttf"); textInputLayout= (TextInputLayout) findViewById(R.id.text_input1); textInputLayout.setTypeface(font_yekan); } }
Solucionando un problema en la respuesta @adneal: si setErrorEnabled no está establecido como true, mErrorView sería nulo y si lo configura en cualquier punto, la fuente cambiará de nuevo al valor predeterminado. Así que para solucionarlo:
En usted personalizado TextInputLayout override setErrorEnabled
@Override public void setErrorEnabled(boolean enabled) { super.setErrorEnabled(enabled); if (enabled) { try { Field cthf = TextInputLayout.class.getDeclaredField("mErrorView"); cthf.setAccessible(true); TextView error = (TextView) cthf.get(this); if (error != null) error.setTypeface(tf); } catch (Exception e) { } } }
final Typeface tf = Typeface.createFromAsset(getAssets(), "your_custom_font.ttf"); final TextInputLayout til = (TextInputLayout) findViewById(R.id.yourTextInputLayout); til.getEditText().setTypeface(tf); til.setTypeface(tf);
- Cómo calibrar el sensor de orientación en android?
- ¿Cómo configurar el color de selección del botón junto con las esquinas redondeadas en Android?