Размер подсказки Android EditText

86

Как уменьшить EditTextразмер подсказки?

Сасикумар
источник
2
Думаю, нет необходимости изменять размер подсказки. почему ты хочешь это сделать?
Praveen
4
Подсказка Размер шрифта очень большой .. Так что мне нужно уменьшить его на 2sp ..
Sasikumar
1
У меня такая же проблема. Мы реализуем приложение для набора номера, поэтому набираемые номера могут быть довольно большими, а текст подсказки должен быть меньше, чтобы соответствовать всему. Спасибо @Jeka за решение!
Bradford2000,
1
<string name = "name"> <font size = "20"> Имя </font> <small> (согласно документу) </small> </string>
Санкет Парчанд,

Ответы:

129

Вы можете сделать это, установив размер в строке ресурса.

Например:

<string name="edittext_hint"><font size="15">Hint here!</font></string>

тогда в вашем XML просто напишите

android:hint="@string/edittext_hint"

Это приведет к уменьшению текста для подсказки, но к исходному размеру входного текста.

Надеюсь, это поможет будущим читателям

Jeka
источник
1
Как указать spразмер sizeатрибута?
f_ficarola 05
1
Поскольку вы не указываете здесь размер, например sp, не будет ли проблема в другом размере экрана? Я не нахожу способов установить размер подсказки через XML-макет, не вызывая проблем при изменении размеров
Вишванат Говда k
2
Это не работает, если подсказка задана программно
ашвин махаджан
60

Вы можете уменьшить размер шрифта на EditText-, что также уменьшит размер hint. т.е.android:textSize="16sp"

чернильный
источник
Спасибо, вы избавили меня от головной боли! :)
peterkodermac
Рад, что смог помочь! :)
inky
Отличный ответ вместо всего этого Work Around: D
Antwan
33
Что, если мне нужны два разных размера: один для реального текста, а другой для подсказки?
f_ficarola 05
Круто, это был довольно умный ответ, но приведенный выше комментарий верен. Что, если мне нужны два разных размера: один для реального текста, а другой для подсказки?
Арслан Али Аван
36

Мне также пришлось сделать это, поскольку моя подсказка не помещалась в EditText стандартного размера. Итак, я сделал это (в xml установите textSize на mHintTextSize):

MYEditText.addTextChangedListener(new TextWatcher(){

                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onTextChanged(CharSequence arg0, int start, int before,
                        int count) {
                    if (arg0.length() == 0) { 
                        // No entered text so will show hint
                        editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, mHintTextSize);
                    } else {
                        editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, mRealTextSize);
                    }
                }
        });
длинношерстный
источник
2
@EVSearchTerm - это его ссылка для редактирования текста. отказ от соглашения об именах.
Рохит Шарма
1
Такой подход работает. Проблема Android SDK заключается в том, что программная установка размера текста полностью игнорируется для размера текста подсказки. С другой стороны, это позволяет упростить подход longhairedsi. Вместо добавления TextWatcherвы можете просто позвонить editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, mRealTextSize);немедленно. Однако решение longhairedsi может быть более безопасным в будущем. Мне любопытно, будет ли эта проблема исправлена ​​в новых версиях SDK.
Peter F
Благодарю. Не забудьте установить начальный размер текста (иначе, когда после запуска текст будет пустым, размер подсказки может быть равен размеру текста).
CoolMind
31

Вы можете установить простые атрибуты HTML для самой строки подсказки.

См. Принятый ответ здесь: Подсказка Android EditText

РЕДАКТИРОВАТЬ: просто играл с ним сам, это сработало для меня:

view.setHint(Html.fromHtml("<small><small><small>" + 
             getString(R.string.hint) + "</small></small></small>"));

Это список тегов, принимаемых fromHtml: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html (хотя у меня это не сработало)

мрамор
источник
12

Если вы хотите сделать это программно,

SpannableString span = new SpannableString(strHint);
span.setSpan(new RelativeSizeSpan(0.5f), 0, strHint.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setHint(span);
user2982553
источник
Мне понравилось
9

легко уменьшить размер подсказки редактируемого текста

editText.setHint(Html.fromHtml(
    "<font size=\"5\">" + "hinttext1" + "</font>" + 
    "<small>" + "hinttext2" + "</small>" )); 
ManiTeja
источник
2

Подход @marmor - лучший. Вы можете изменить количество <small> --- </small>тегов, чтобы настроить размер.

Вы также можете определить текст подсказки напрямую, как это сделал я

view.setHint(Html.fromHtml("<small><small><small>" + "This is Hint" + "</small></small></small>"));

Надеюсь, это поможет.

dmSherazi
источник
1

Решение @ user2982553 отлично подходит для меня. Вы также можете использовать AbsoluteSizeSpan, с помощью которого вы можете установить точный размер шрифта подсказки. Не используйте <font size=\"5\">тег, потому что sizeатрибут просто игнорируется.

Trojantale
источник
1

определите это в вашем strings.xml в папке значений:

<string name="enter_otp"><font size="16">your text</font></string>
Мохаммад Давари
источник
0

Мне нужно установить для реального текста больший размер, чем подсказка.

public static class LargeSizeTextWatcher implements TextWatcher {

    private final EditText mEditText;
    private final int mOriginalSize;
    private final int mLargeSize;

    private int mLastLength;

    TrackingNumberTextWatcher(EditText editText) {
        mEditText = editText;
        mOriginalSize = (int) editText.getTextSize();
        mLargeSize = editText.getResources().getDimensionPixelSize(R.dimen.text_size_large);

        mLastLength = editText.length();
        if (mLastLength != 0) {
            mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mLargeSize);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        int length = s.length();
        if (length == 0) {
            mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOriginalSize);
        } else if (mLastLength == 0) {
            mEditText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mLargeSize);
        }
        mLastLength = length;
    }
}
Edwardaa
источник
0

Вы можете изменить не только размер подсказки, но также ее шрифт и стиль. Мне удалось решить эту проблему, используя SpannableStringиMetricAffectingSpan

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

3) Использование:

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);
Аяз Алифов
источник
0

Использование прослушивателя onFocusChanged () для изменения размера шрифта подсказки также является вариантом, поскольку addTextChangeListener () не срабатывает, когда пользователь нажимает на текстовое поле, а размер мигающего курсора изменится на шрифт подсказки.

Кроме того, в отличие от TextChangeListener, нет необходимости отдельно устанавливать начальный размер шрифта подсказки.

class EditTextWithHintSize {
 init {
        val typedArray = context.obtainStyledAttributes(attrs,
                R.styleable.EditTextWithHintSize, 0, defStyle)
        try {
            hintFontSize = typedArray.getDimension(R.styleable.EditTextWithHintSize_hint_font_size, textSize)
            fontSize = textSize

            if (length() == 0) {
                setTextSize(TypedValue.COMPLEX_UNIT_PX, hintFontSize)
            }
        } catch (e: Exception) {
            hintFontSize = textSize
            fontSize = textSize
        } finally {
            typedArray.recycle()
        }
    }

    override fun onFocusChanged(focused: Boolean, direction: Int, previouslyFocusedRect: Rect?) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect)

        if (focused) {
            setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
        } else {
            if (length() == 0) {
                setTextSize(TypedValue.COMPLEX_UNIT_PX, hintFontSize)
            } else {
                setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
            }
        }
    }
}
Southerton
источник