EditText
入力フィールドがあります。ヒントを追加しました。ヒントテキストのサイズを変更したいのですが、これを行うと、テキストのサイズにも影響します。ヒントとテキストのサイズを個別に変更し、ヒントとテキストの両方に異なるフォントを指定する方法を教えてください。
<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" />
ヒントとテキストは排他的です。一方が表示されている場合、もう一方は表示されません。
このため、空である(ヒントが表示される)か空でない(テキストが表示される)かによって、EditText
の属性を変更するだけで済みます。
例えば:
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) {
}
});
リソースファイルで設定できます。
例えば:
<string name="hint"><font size="20">Hint!</font></string>
そしてあなたのXML:
Android:hint="@string/hint"
テキストサイズを小さい値に設定し、テキストを入力した後にテキストサイズを変更するようにテキストリスナーを設定できます。
HTMLの使用は問題ありませんが、柔軟性はありません。たとえば、正確なサイズを設定することはできません。私はあなたが設定できる代替ソリューションを提供します:
1)カスタムHint
オブジェクトを作成します:
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)カスタムMetricAffectingSpan
オブジェクトを作成:
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);
}
}
)使用:
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);