Размер подсказки 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"

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

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


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


9

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

editText.setHint(Html.fromHtml(
    "<font size=\"5\">" + "hinttext1" + "</font>" + 
    "<small>" + "hinttext2" + "</small>" )); 

2

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

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

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

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


1

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



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

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)
            }
        }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.