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:

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

Introduzca aquí la descripción de la imagen

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:

  1. Use la reflexión agarre el TextView error y aplique el Typeface como antes
  2. Utilice un intervalo personalizado. A diferencia de la etiqueta flotante, la vista de error utilizada por TextInputLayout es sólo un TextView , 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

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); 
  • Android Ice Cream Sandwich Editado: Desactivación de la corrección ortográfica y la conversión de palabras
  • EditText no se actualiza después de que se cambió el texto en TextWatcher
  • Android: el primer dígito en el texto de edición no puede ser cero
  • Android RecyclerView: Cambiar archivo de diseño LIST a GRID onOptionItemSelected
  • ¿Cambiar el color del texto mientras el usuario está escribiendo?
  • TextWatcher.afterTextChanged tiene cadena incorrecta después de retroceso
  • Cómo establecer el color de borde para EditText
  • Cómo calcular el texto que puede encajar en un WebView sin desplazamiento
  • Mostrar el teclado para edittext cuando se inicia el fragmento
  • Cómo mostrar el teclado personalizado al hacer clic en edittext en android
  • ¿Cómo obtener el contexto del método View in TextWatcher?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.