web-dev-qa-db-ja.com

EditTextでテキストサイズを変更せずにヒントテキストサイズを変更する方法

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

ヒントとテキストは排他的です。一方が表示されている場合、もう一方は表示されません。

このため、空である(ヒントが表示される)か空でない(テキストが表示される)かによって、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) {
    }
});
10
earthw0rmjim

リソースファイルで設定できます。

例えば:

<string name="hint"><font size="20">Hint!</font></string>

そしてあなたのXML:

Android:hint="@string/hint"
28
Filip Rosca

テキストサイズを小さい値に設定し、テキストを入力した後にテキストサイズを変更するようにテキストリスナーを設定できます。

1
Jesse Buss

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);
1
Ayaz Alifov