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));
À 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
.
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:
TextView
et appliquez la Typeface
un peu comme avant.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
La police que j'utilise est Smoothie Shoppe .
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);
}
}
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.
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:
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);
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) {
}
}
}
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.
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
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());
}
}
});
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>