textinputedittext textfields outlined form fields example android android-edittext android-design-library android-textinputlayout material-components

android - textfields - Cambiar la fuente de la etiqueta flotante EditText y TextInputLayout



textinputlayout android (11)

A partir de Design Library v23 , puede usar TextInputLayout#setTypeface() .

Esto establecerá el tipo de letra en la sugerencia expandida y flotante.

Aquí está la solicitud de función donde se discutió en b.android.com .

EDITAR: el tipo de letra de la vista de error no se estaba configurando, pero ahora está fixed en v25.1.0

¿Alguien intentó 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 los que me ayudaron

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


Acabo de encontrar una solución simple y me ha funcionado:

De esta manera, puede configurar el tipo de letra para insinuar 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 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); } }


Aquí hay 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 usar CustomTextInputLayout lugar de TextInputLayout y funcionará 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 por la respuesta.


Así es como logro esto.

edit_login_emailOrPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) { textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceSemiBold()); }else { textInputLayout_login_emailOrPhone.setTypeface(APSApplication.getInstance().getFonts().getTypefaceRegular()); } } });


Desafortunadamente, tendrás que usar la reflexión para manejar esto.

La etiqueta flotante es dibujada por CollapsingTextHelper , que es una clase interna, privada de paquetes y no está configurada para manejar intervalos. 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. Utilice Reflexión, tome el error TextView y aplique el Typeface como antes.
  2. Use un lapso personalizado. A diferencia de la etiqueta flotante, la vista de error utilizada por TextInputLayout es solo una TextView , por lo que es capaz de manejar los intervalos.

Usando la reflexion

final Field errorField = til.getClass().getDeclaredField("mErrorView"); errorField.setAccessible(true); ((TextView) errorField.get(til)).setTypeface(tf);

Utilizando un intervalo 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 .


El uso puede usar style.xml como a continuación:

Archivo de estilo:

<style name="TextInputLayoutErrorStyle" parent="TextAppearance.Design.Error"> <item name="fontFamily">@font/iran_sans_medium</item> <item name="android:fontFamily">@font/iran_sans_medium</item> </style> <style name="TextInputLayoutHintStyle" parent="TextAppearance.Design.Hint"> <item name="fontFamily">@font/iran_sans_medium</item> <item name="android:fontFamily">@font/iran_sans_medium</item> </style> <style name="TextInputLayoutHelperStyle" parent="TextAppearance.Design.HelperText"> <item name="fontFamily">@font/iran_sans_medium</item> <item name="android:fontFamily">@font/iran_sans_medium</item> </style> <style name="TextInputLayoutOutlinedBoxStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <item name="helperTextTextAppearance">@style/TextInputLayoutHelperStyle</item> <item name="errorTextAppearance">@style/TextInputLayoutErrorStyle</item> <item name="hintTextAppearance">@style/TextInputLayoutHintStyle</item> </style>

Archivo de diseño:

<com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_centerInParent="true" android:hint="@string/cardname_hint" android:layout_marginStart="30dp" android:layout_marginEnd="30dp" card_view:helperText="@string/cardname_helper" style="@style/TextInputLayoutOutlinedBoxStyle" android:layout_height="wrap_content"> <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:fontFamily="@font/iran_sans_medium" android:textColor="@color/colorTextPrimary" android:layout_height="wrap_content" /> </com.google.android.material.textfield.TextInputLayout>


Estaba buscando esto, lo encontré de esta manera, usando la biblioteca de soporte:

Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);

y establezca este tipo de letra a su TextInpuLayout.

Para mi funciona como un encanto, espero que ayude a otros =]

Fuente: Documentation


Estoy usando un nuevo tema de MaterialComponents y ninguna de las respuestas me ayudó.

Tuve que jugar con estilos y temas por mi cuenta. Publicará una parte de los estilos aquí en caso de que alguien se enfrente al mismo problema.

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> ... <item name="textInputStyle">@style/CustomFontTextInputLayout</item> </style> <!-- region TextInputLayout & TextInputEditText styles --> <style name="TextInputLayout.OutlineBox.CustomFont" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"> <item name="android:theme">@style/ThemeOverlay.TextInputEditText.OutlinedBox.CustomFont</item> </style> <style name="ThemeOverlay.TextInputEditText.OutlinedBox.CustomFont" parent="ThemeOverlay.MaterialComponents.TextInputEditText.OutlinedBox"> <item name="editTextStyle">@style/TextInputEditText.OutlinedBox.CustomFont</item> </style> <style name="TextInputEditText.OutlinedBox.CustomFont" parent="Widget.MaterialComponents.TextInputEditText.OutlinedBox"> <item name="android:fontFamily">@font/my_font</item> </style> <style name="CustomFontTextInputLayout" parent="Widget.Design.TextInputLayout"> <item name="hintTextAppearance">@style/TextInputLayoutHintText</item> <item name="helperTextTextAppearance">@style/TextInputLayoutHelperText</item> <item name="errorTextAppearance">@style/TextInputLayoutErrorText</item> </style> <style name="TextInputLayoutHintText" parent="TextAppearance.Design.Hint"> <item name="android:fontFamily">@font/my_font</item> </style> <style name="TextInputLayoutHelperText" parent="TextAppearance.Design.HelperText"> <item name="android:fontFamily">@font/my_font</item> </style> <style name="TextInputLayoutErrorText" parent="TextAppearance.Design.Error"> <item name="android:fontFamily">@font/my_font</item> </style> <!-- endregion -->

Luego en el diseño xml:

<android.support.design.widget.TextInputLayout style="@style/TextInputLayout.OutlineBox.CustomFont" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.design.widget.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/first_name"/> </android.support.design.widget.TextInputLayout>

Aquí está el resultado:


Hay una manera más simple,

Cree un nuevo directorio en su carpeta ''res'' llamada ''fuente'' y ponga una fuente allí. Luego abre tu archivo de ''estilos'' y crea un nuevo estilo:

<style name="customfontstyle" parent="@android:style/TextAppearance.Small"> <item name="android:fontFamily">@font/poppins_regular</item> </style>

También puede agregar más propiedades, como textColor, textSize, etc.

Luego en tu XML:

<android.support.design.widget.TextInputLayout android:layout_width="wrap_content" android:layout_height="wrap_content" app:hintTextAppearance="@style/customfontstyle" > <android.support.design.widget.TextInputEditText android:layout_width="220dp" android:layout_height="wrap_content" android:id="@+id/edit_phone_number" android:hint="@string/phone_number_label" android:inputType="number" /> </android.support.design.widget.TextInputLayout>

Lo comprobé y funciona.


solucionando un problema en @adneal answer: si setErrorEnabled no se establece como verdadero, mErrorView sería nulo y si lo configuraba como falso en cualquier punto, la fuente volvería a ser predeterminada. así que para arreglarlo:

en usted, TextInputLayout reemplaza a 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);