web-dev-qa-db-fra.com

Changer la police des étiquettes flottantes EditText et TextInputLayout

Quelqu'un a essayé de changer la police de l'étiquette flottante? J'ai changé la source de EditText mais la police de l'étiquette flottante n'a pas changé, je suis très reconnaissant à ceux qui m'aident

Code:

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

enter image description here

20
user2350939

À partir de Design Library v23, vous pouvez utiliser TextInputLayout#setTypeface() .

Cela définira le caractère à la fois sur l'indicateur développé et flottant.

Voici la demande de fonctionnalité où elle a été discutée sur b.Android.com .

EDIT: Le type de vue d'erreur n'était pas défini, mais est maintenant corrigé dans v25.1.0.

26
Austyn Mahoney

Malheureusement, vous devrez utiliser la réflexion pour gérer cela. 

L'étiquette flottante est dessinée par CollapsingTextHelper, qui est une classe interne à paquet privé et qui n'est pas configurée pour gérer les étendues. Donc, utiliser quelque chose comme une TypefaceSpan personnalisée ne fonctionnera pas dans ce cas.

Parce que cela utilise la réflexion, il n'est pas garanti que cela fonctionne dans le futur.

La mise en oeuvre

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
}

Vue d'erreur

Si vous aviez besoin de changer la police de l'erreur, vous pouvez faire l'une des choses suivantes:

  1. Utilisez Reflection pour récupérer l’erreur TextView et appliquez la Typeface un peu comme avant.
  2. Utilisez une étendue personnalisée. Contrairement à l'étiquette flottante, la vue d'erreur utilisée par TextInputLayout est simplement une TextView et permet donc de gérer les plages.

Utilisation de la réflexion

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

Utiliser un span personnalisé

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

}

Résultats

results

La police que j'utilise est Smoothie Shoppe .

19
adneal

je viens de trouver une solution simple et cela a fonctionné pour moi:

de cette façon, vous pouvez définir le caractère de la police de manière à laisser entendre le texte de montage:

dans 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>

et en classe 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);
      }
 }
6
Iman Sadrian

Voici une implémentation de classe personnalisée pour la réponse 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
        }
    }
}

Dans vos fichiers XML, vous devez maintenant utiliser CustomTextInputLayout au lieu de TextInputLayout et cela fonctionnera immédiatement.

<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" />

Merci adneal pour la réponse.

6
Aleksandar Ilic

J'utilise new MaterialComponents theme et aucune des réponses ne m'a aidé.

J'ai dû jouer avec des styles et des thèmes tout seul. Publierons un morceau de styles ici au cas où quelqu'un serait confronté au même problème.

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

Puis dans la mise en page 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>

Voici le résultat:

 enter image description here

5
azizbekian
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);
2
Ali

résolution d'un problème dans @adneal réponse: si setErrorEnabled n'est pas défini sur true, mErrorView sera null et si vous le définissez sur false à tout moment, la police sera redéfinie sur la valeur par défaut .

dans votre personnalisation TextInputLayout remplacer 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) {

        }
    }
}
1
Ashkan Ghodrat

Il y a un moyen plus simple, 

Créez un nouveau répertoire dans votre dossier 'res' nommé 'font' et insérez une police. Ensuite, ouvrez votre fichier 'styles' et créez un nouveau style:

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

Vous pouvez également ajouter d'autres propriétés, telles que textColor, textSize, etc.

Puis dans votre 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>

Je l'ai vérifié et ça marche.

1
Danish Ajaib

Je cherchais ceci, j'ai trouvé ceci, en utilisant la bibliothèque de support:

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

et réglez cette police de caractère sur TextInpuLayout.

Pour moi fonctionne comme un charme, j'espère que cela aide les autres =]

Source: Documentation

0
Lucas Orso

Voici comment je réalise cela

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());
            }
        }
    });
0
zohaib khaliq

Utilisez peut utiliser style.xml comme ci-dessous:

Fichier de style:

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

Fichier de mise en page:

<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>
0
Ehsan Mashhadi