Розмір підказки для редагування тексту Android


83

Як зменшити EditTextрозмір підказки?


2
Я думаю, що немає необхідності змінювати розмір підказки. чому ти хочеш це зробити?
Praveen

4
Підказка Розмір шрифту дуже великий .. Тож мені потрібно зменшити 2sp від нього ..
Sasikumar

1
У мене була та сама проблема. Ми реалізуємо додаток дозвону, тому набрані номери можуть бути досить великими, тоді як текст підказки повинен бути меншим, щоб вмістити все. Дякую @Jeka за рішення!
Бредфорд

1
<string name = "name"> <font size = "20"> Ім'я </font> <small> (Відповідно до документації) </small> </string>
Санкет Паршан,

Відповіді:


128

Це можна зробити, встановивши розмір у джерелі рядків.

Наприклад:

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

тоді у своєму XML просто напишіть

android:hint="@string/edittext_hint"

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

Сподіваюся, це допоможе майбутнім читачам


1
Як вказати spрозмір для sizeатрибута?
f_ficarola

1
Оскільки ви тут не вказуєте розмір, як sp, чи не буде це проблемою в різному розмірі екрана? Я не знаходжу жодних способів встановити розмір підказки за допомогою макета xml, не викликаючи проблем при зміні розмірів
Vishwanath gowda k

2
Це не працює, коли підказка встановлена ​​програмно
ashwin mahajan

60

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


Дякую, ти врятував мені кілька головних болів! :)
peterkodermac

Радий, що міг допомогти! :)
inky

Чудова відповідь замість всього цього
Подолання

33
Що робити, якщо я хочу два різних розміри, один для справжнього тексту, а інший для підказки?
f_ficarola

Класно, це була досить розумна відповідь, але наведений вище коментар є правильним. Що, якщо я хочу два різні розміри, один для справжнього тексту, а інший для підказки?
Арслан Алі Аван

35

Мені також довелося це зробити, оскільки мій підказка не вмістилася в 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. Замість додавання a 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 (хоча у мене не працював)


11

Якщо ви хочете зробити це програмно,

SpannableString span = new SpannableString(strHint);
span.setSpan(new RelativeSizeSpan(0.5f), 0, strHint.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setHint(span);

Сподобалося ваше рішення, але, на жаль, не спрацювало, завантаження з ресурсів та динамічне встановлення його на TextInputLayout
JimmyFlash

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.