Rozmiar podpowiedzi do edycji tekstu w systemie Android

86

Jak zmniejszyć EditTextrozmiar podpowiedzi?

Sasikumar
źródło
2
Myślę, że nie ma potrzeby zmiany rozmiaru podpowiedzi. dlaczego chcesz to zrobić?
Praveen
4
Podpowiedź Rozmiar czcionki jest bardzo duży .. Więc muszę zmniejszyć z niego 2
sp
1
Miałem ten sam problem. Wdrażamy aplikację do wybierania numerów, więc wybierane numery mogą być dość duże, podczas gdy tekst podpowiedzi musi być mniejszy, aby wszystko pasowało. Dzięki @Jeka za rozwiązanie!
Bradford2000
1
<string name = "name"> <font size = "20"> Nazwa </font> <small> (zgodnie z dokumentem) </small> </string>
Sanket Parchande

Odpowiedzi:

129

Możesz to zrobić, ustawiając rozmiar w rekordzie ciągu.

Na przykład:

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

następnie w swoim XML po prostu napisz

android:hint="@string/edittext_hint"

Spowoduje to zmianę mniejszego tekstu dla wskazówki, ale oryginalny rozmiar tekstu wejściowego.

Mam nadzieję, że pomoże to przyszłym czytelnikom

Jeka
źródło
1
Jak określić spwymiar sizeatrybutu?
f_ficarola
1
Ponieważ nie określasz tutaj wymiarów, takich jak sp, czy nie byłoby problemu przy innym rozmiarze ekranu? Nie znajduję żadnego sposobu na ustawienie rozmiaru podpowiedzi przez układ XML bez powodowania problemu przy zmianie wymiarów
Vishwanath gowda k
2
To nie działa, gdy podpowiedź jest ustawiona programowo
ashwin mahajan
60

Możesz zmniejszyć rozmiar czcionki na EditText- to również zmniejszy rozmiar hint. to znaczyandroid:textSize="16sp"

atramentowy
źródło
Dziękuję, uratowałeś mi trochę bólu głowy! :)
peterkodermac
Cieszę się, że mogłem pomóc! :)
atramentowy
Świetna odpowiedź zamiast tego. Work Around: D
Antwan,
33
A jeśli chcę mieć dwa różne rozmiary, jeden dla prawdziwego tekstu, a drugi dla podpowiedzi?
f_ficarola
Fajnie, to była całkiem sprytna odpowiedź, ale powyższy komentarz jest poprawny Co jeśli chcę dwa różne rozmiary, jeden dla prawdziwego tekstu, a drugi dla podpowiedzi?
Arslan Ali Awan
36

Musiałem to również zrobić, ponieważ moja wskazówka nie pasowała do tekstu edycji w standardowym rozmiarze. Więc zrobiłem to (w xml ustawiłem textSize na 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);
                    }
                }
        });
longhairedsi
źródło
2
@EVSearchTerm to jego odniesienie do edittext. porzucona konwencja nazewnictwa.
Rohit Sharma
1
To podejście działa. Problem z Android SDK polega na tym, że programowe ustawianie rozmiaru tekstu jest całkowicie ignorowane w przypadku rozmiaru tekstu podpowiedzi. Z drugiej strony pozwala to na uproszczenie podejścia długowłosego. Zamiast dodawać TextWatchernumer, możesz po prostu zadzwonić editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, mRealTextSize);natychmiast. Jednak rozwiązanie longhairedsi może być bardziej bezpieczne w przyszłości. Jestem ciekaw, czy ten problem zostanie rozwiązany w nowszych wersjach SDK.
Peter F
Dzięki. Nie zapomnij ustawić początkowego rozmiaru tekstu (w przeciwnym razie, gdy po rozpoczęciu tekst jest pusty, rozmiar podpowiedzi może być równy rozmiarowi tekstu).
CoolMind
31

Możesz ustawić proste atrybuty HTML w samym ciągu podpowiedzi.

Zobacz zaakceptowaną odpowiedź tutaj: Wskazówka dotycząca edycji tekstu w systemie Android

EDYCJA: po prostu grałem z tym sam, to działało dla mnie:

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

To jest lista tagów akceptowanych przez fromHtml: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html (chociaż nie działało to dla mnie)

marmor
źródło
12

Jeśli chcesz to zrobić programowo,

SpannableString span = new SpannableString(strHint);
span.setSpan(new RelativeSizeSpan(0.5f), 0, strHint.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setHint(span);
user2982553
źródło
Uwielbiałem Twoje rozwiązanie, ale niestety nie działało, ładowanie z zasobów i dynamiczne ustawianie go na TextInputLayout
JimmyFlash
9

łatwo jest zmniejszyć rozmiar podpowiedzi w pliku edittext

editText.setHint(Html.fromHtml(
    "<font size=\"5\">" + "hinttext1" + "</font>" + 
    "<small>" + "hinttext2" + "</small>" )); 
ManiTeja
źródło
2

Podejście @marmor jest najlepsze. Możesz zmienić liczbę <small> --- </small>tagów, aby dostosować rozmiar.

Możesz również zdefiniować tekst podpowiedzi bezpośrednio, tak jak ja

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

Mam nadzieję, że to pomoże.

dmSherazi
źródło
1

Rozwiązanie @ user2982553 działa świetnie dla mnie. Możesz także użyć AbsoluteSizeSpan, za pomocą którego możesz ustawić dokładny rozmiar czcionki podpowiedzi. Nie używaj <font size=\"5\">tagu, ponieważ sizeatrybut jest po prostu ignorowany.

trojantale
źródło
1

zdefiniuj to w swoim strings.xml w folderze wartości:

<string name="enter_otp"><font size="16">your text</font></string>
Mohammad Davari
źródło
0

Muszę ustawić większy rozmiar dla prawdziwego tekstu niż podpowiedź.

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
źródło
0

Możesz zmienić nie tylko rozmiar podpowiedzi, ale także jej czcionkę i styl. Udało mi się to rozwiązać za pomocą SpannableStringiMetricAffectingSpan

1) Utwórz Hintobiekt niestandardowy :

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) Utwórz MetricAffectingSpanobiekt niestandardowy :

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) zastosowanie:

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);
Ayaz Alifov
źródło
0

Użycie detektora onFocusChanged () do zmiany rozmiaru czcionki podpowiedzi jest również opcją, ponieważ addTextChangeListener () nie będzie wyzwalane, gdy użytkownik kliknie pole tekstowe, a migający kursor zmieni rozmiar na czcionkę podpowiedzi.

Ponadto, w przeciwieństwie do TextChangeListener, nie ma potrzeby osobnego ustawiania początkowego rozmiaru czcionki podpowiedzi.

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
źródło