J'ai un champ de saisie EditText
. J'ai ajouté un indice dans celui-ci. Maintenant, je veux changer la taille du texte d'aide, mais quand je fais cela, cela affecte également la taille du texte. Veuillez m'indiquer comment modifier la taille du conseil et du texte séparément, et attribuer des polices différentes au conseil et au texte.
<EditText
Android:layout_width="0dp"
Android:layout_height="50dp"
Android:layout_weight="1"
Android:textSize="12sp"
Android:textColor="#ffffff"
Android:fontFamily="sans-serif-light"
Android:hint="MM/YY"
Android:textColorHint="@color/white" />
L'indice et le texte sont exclusifs, si l'un d'eux est visible, l'autre ne l'est pas.
De ce fait, vous pouvez simplement modifier les attributs de votre EditText
en fonction de son caractère vide (l'indice est visible) ou non (le texte est visible).
Par exemple:
final EditText editText = (EditText) findViewById(R.id.yourEditText);
editText.addTextChangedListener(new TextWatcher() {
boolean hint;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.length() == 0) {
// no text, hint is visible
hint = true;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
editText.setTypeface(Typeface.createFromAsset(getAssets(),
"hintFont.ttf")); // setting the font
} else if(hint) {
// no hint, text is visible
hint = false;
editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
editText.setTypeface(Typeface.createFromAsset(getAssets(),
"textFont.ttf")); // setting the font
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
Vous pouvez le définir dans un fichier de ressources.
Par exemple:
<string name="hint"><font size="20">Hint!</font></string>
Et votre XML:
Android:hint="@string/hint"
Vous pouvez définir la taille du texte sur la valeur souhaitée la plus petite, puis définir un programme d'écoute de texte pour modifier la taille du texte après la saisie de texte.
L'utilisation de HTML est acceptable, mais non flexible. Par exemple, vous ne pouvez pas définir la taille exacte. Je vais fournir une solution alternative où vous pouvez définir:
1) Créez un objet Hint
personnalisé:
import Android.graphics.Typeface;
import Android.text.SpannableString;
import Android.text.Spanned;
import Android.text.style.MetricAffectingSpan;
public class CustomHint extends SpannableString
{
public CustomHint(final CharSequence source, final int style)
{
this(null, source, style, null);
}
public CustomHint(final CharSequence source, final Float size)
{
this(null, source, size);
}
public CustomHint(final CharSequence source, final int style, final Float size)
{
this(null, source, style, size);
}
public CustomHint(final Typeface typeface, final CharSequence source, final int style)
{
this(typeface, source, style, null);
}
public CustomHint(final Typeface typeface, final CharSequence source, final Float size)
{
this(typeface, source, null, size);
}
public CustomHint(final Typeface typeface, final CharSequence source, final Integer style, final Float size)
{
super(source);
MetricAffectingSpan typefaceSpan = new CustomMetricAffectingSpan(typeface, style, size);
setSpan(typefaceSpan, 0, source.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
2) Créer un objet MetricAffectingSpan
personnalisé:
import Android.graphics.Typeface;
import Android.text.TextPaint;
import Android.text.style.MetricAffectingSpan;
public class CustomMetricAffectingSpan extends MetricAffectingSpan
{
private final Typeface _typeface;
private final Float _newSize;
private final Integer _newStyle;
public CustomMetricAffectingSpan(Float size)
{
this(null, null, size);
}
public CustomMetricAffectingSpan(Float size, Integer style)
{
this(null, style, size);
}
public CustomMetricAffectingSpan(Typeface type, Integer style, Float size)
{
this._typeface = type;
this._newStyle = style;
this._newSize = size;
}
@Override
public void updateDrawState(TextPaint ds)
{
applyNewSize(ds);
}
@Override
public void updateMeasureState(TextPaint Paint)
{
applyNewSize(Paint);
}
private void applyNewSize(TextPaint Paint)
{
if (this._newStyle != null)
Paint.setTypeface(Typeface.create(this._typeface, this._newStyle));
else
Paint.setTypeface(this._typeface);
if (this._newSize != null)
Paint.setTextSize(this._newSize);
}
}
3) Utilisation:
Typeface newTypeface = Typeface.createFromAsset(getAssets(), "AguafinaScript-Regular.ttf");
CustomHint customHint = new CustomHint(newTypeface, "Enter some text", Typeface.BOLD_ITALIC, 60f);
// CustomHint customHint = new CustomHint(newTypeface, "Enter some text", Typeface.BOLD_ITALIC);
// CustomHint customHint = new CustomHint(newTypeface, "Enter some text", 60f);
// CustomHint customHint = new CustomHint("Enter some text", Typeface.BOLD_ITALIC, 60f);
// CustomHint customHint = new CustomHint("Enter some text", Typeface.BOLD_ITALIC);
// CustomHint customHint = new CustomHint("Enter some text", 60f);
customEditText.setHint(customHint);