Dimensioni del carattere diverse delle stringhe nello stesso TextView


141

Ho un textViewinterno con un numero (variabile) e un string, come posso dare la dimensione del numero uno più grande della string? il codice:

TextView size = (TextView)convertView.findViewById(R.id.privarea_list_size);
if (ls.numProducts != null) {
    size.setText(ls.numProducts + " " + mContext.getString(R.string.products));
}

Voglio che ls.numproducts abbia una dimensione diversa dal resto del testo. Come fare?

Risposte:


360

Usare un Spannable String

 String s= "Hello Everyone";
 SpannableString ss1=  new SpannableString(s);
 ss1.setSpan(new RelativeSizeSpan(2f), 0,5, 0); // set size
 ss1.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);// set color
 TextView tv= (TextView) findViewById(R.id.textview);
 tv.setText(ss1); 

Scatto istantaneo

inserisci qui la descrizione dell'immagine

È possibile dividere la stringa utilizzando lo spazio e aggiungere l'intervallo alla stringa richiesta.

 String s= "Hello Everyone";  
 String[] each = s.split(" ");

Ora applica spana stringe aggiungi lo stesso a textview.


setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) termina oltre la lunghezza 1. Cosa significa?
Adriana Carelli,

controlla la lunghezza della stringa. IndexOutOfBoundsException: indica una posizione dell'indice errata per l'inizio e la fine dell'intervallo. nella lunghezza Hello sopra è 5, quindi ho applicato l'intervallo dall'indice 0 al 5
Raghunandan,

Ha funzionato perfettamente su Google Glass!
Mohammad Arman,

2
c'è un modo per spostare i caratteri piccoli al centro in direzione verticale? Fondamentalmente tutti i personaggi dovrebbero essere centrati verticalmente indipendentemente dalle dimensioni.
500865,

Probabilmente hai bisogno di due visualizzazioni di testo in quel caso, altrimenti devi creare la tua visualizzazione di testo
Raghunandan,

119

Nel caso ti stia chiedendo come puoi impostare più dimensioni diverse nella stessa visualizzazione di testo, ma utilizzando una dimensione assoluta e non una relativa, puoi ottenerla utilizzando AbsoluteSizeSpaninvece di a RelativeSizeSpan.

Ottieni la dimensione in pixel della dimensione del testo desiderata

int textSize1 = getResources().getDimensionPixelSize(R.dimen.text_size_1);
int textSize2 = getResources().getDimensionPixelSize(R.dimen.text_size_2);

e quindi crearne uno nuovo in AbsoluteSpanbase al testo

String text1 = "Hi";
String text2 = "there";

SpannableString span1 = new SpannableString(text1);
span1.setSpan(new AbsoluteSizeSpan(textSize1), 0, text1.length(), SPAN_INCLUSIVE_INCLUSIVE);

SpannableString span2 = new SpannableString(text2);
span2.setSpan(new AbsoluteSizeSpan(textSize2), 0, text2.length(), SPAN_INCLUSIVE_INCLUSIVE);

// let's put both spans together with a separator and all
CharSequence finalText = TextUtils.concat(span1, " ", span2);

Buona aggiunta con l' AbsoluteSizeSpanesempio
eugeneek,

@AmitGarg vuoi elaborare?
Joao Sousa,

4
Puoi anche usare AbsoluteSizeSpan(sizeInDip, true)per specificare la dimensione direttamente in dp
Ilia Grabko l'

8

Puoi farlo usando la stringa html e impostando l'html su Textview usando
txtView.setText(Html.fromHtml("Your html string here"));

Per esempio :

txtView.setText(Html.fromHtml("<html><body><font size=5 color=red>Hello </font> World </body><html>"));`

1
Bel contributo! Ma fromHtml da ora in poi (API> = N) è obsoleto. Affinché ciò funzioni, abilitare la modalità di compatibilità: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("your html string") , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("la tua stringa html")); }
statosdotcom,

Qual è l'unità di "5"? È dp? È sp? Come posso cambiarlo in uno di quelli?
sviluppatore Android il

i colori e la famiglia funzionano comunque, le dimensioni non funzionano.
c-an

5

Metodo 1

public static void increaseFontSizeForPath(Spannable spannable, String path, float increaseTime) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new RelativeSizeSpan(increaseTime), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

utilizzando

Utils.increaseFontSizeForPath(spannable, "big", 3); // make "big" text bigger 3 time than normal text

inserisci qui la descrizione dell'immagine

Metodo 2

public static void setFontSizeForPath(Spannable spannable, String path, int fontSizeInPixel) {
    int startIndexOfPath = spannable.toString().indexOf(path);
    spannable.setSpan(new AbsoluteSizeSpan(fontSizeInPixel), startIndexOfPath,
            startIndexOfPath + path.length(), 0);
}

utilizzando

Utils.setFontSizeForPath(spannable, "big", (int) textView.getTextSize() + 20); // make "big" text bigger 20px than normal text

inserisci qui la descrizione dell'immagine



3
private SpannableStringBuilder SpannableStringBuilder(final String text, final char afterChar, final float reduceBy) {
        RelativeSizeSpan smallSizeText = new RelativeSizeSpan(reduceBy);
        SpannableStringBuilder ssBuilder = new SpannableStringBuilder(text);
        ssBuilder.setSpan(
                smallSizeText,
                text.indexOf(afterChar),
                text.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
        );

        return ssBuilder;
    }
------------------------
TextView textView =view.findViewById(R.id.textview);
String s= "123456.24";
textView.setText(SpannableStringBuilder(s, '.', 0.7f));

---------------- Risultato ---------------

Risultato:

12345. 24


2

Il modo migliore per farlo è Html senza sottostringa del testo e completamente dinamico Ad esempio:

  public static String getTextSize(String text,int size) {
         return "<span style=\"size:"+size+"\" >"+text+"</span>";

    }

e puoi usare l'attributo del colore ecc ... se invece:

size.setText(Html.fromHtml(getTextSize(ls.numProducts,100) + " " + mContext.getString(R.string.products));  

1

Ho scritto la mia funzione che richiede 2 stringhe e 1 int (dimensione del testo)

Il testo completo e la parte del testo che si desidera modificare la dimensione di esso.

Restituisce un SpannableStringBuilder che puoi usare in visualizzazione testo.

  public static SpannableStringBuilder setSectionOfTextSize(String text, String textToChangeSize, int size){

        SpannableStringBuilder builder=new SpannableStringBuilder();

        if(textToChangeSize.length() > 0 && !textToChangeSize.trim().equals("")){

            //for counting start/end indexes
            String testText = text.toLowerCase(Locale.US);
            String testTextToBold = textToChangeSize.toLowerCase(Locale.US);
            int startingIndex = testText.indexOf(testTextToBold);
            int endingIndex = startingIndex + testTextToBold.length();
            //for counting start/end indexes

            if(startingIndex < 0 || endingIndex <0){
                return builder.append(text);
            }
            else if(startingIndex >= 0 && endingIndex >=0){

                builder.append(text);
                builder.setSpan(new AbsoluteSizeSpan(size, true), startingIndex, endingIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }else{
            return builder.append(text);
        }

        return builder;
    }

0

Nel caso in cui tu voglia evitare troppa confusione per i tuoi traduttori, ho escogitato un modo per avere solo un segnaposto nelle stringhe, che verrà gestito in codice.

Quindi, suppongo che tu abbia questo nelle corde:

    <string name="test">
        <![CDATA[
        We found %1$s items]]>
    </string>

E vuoi che il testo segnaposto abbia dimensioni e colori diversi, puoi usare questo:

        val textToPutAsPlaceHolder = "123"
        val formattedStr = getString(R.string.test, "$textToPutAsPlaceHolder<bc/>")
        val placeHolderTextSize = resources.getDimensionPixelSize(R.dimen.some_text_size)
        val placeHolderTextColor = ContextCompat.getColor(this, R.color.design_default_color_primary_dark)
        val textToShow = HtmlCompat.fromHtml(formattedStr, HtmlCompat.FROM_HTML_MODE_LEGACY, null, object : Html.TagHandler {
            var start = 0
            override fun handleTag(opening: Boolean, tag: String, output: Editable, xmlReader: XMLReader) {
                when (tag) {
                    "bc" -> if (!opening) start = output.length - textToPutAsPlaceHolder.length
                    "html" -> if (!opening) {
                        output.setSpan(AbsoluteSizeSpan(placeHolderTextSize), start, start + textToPutAsPlaceHolder.length, 0)
                        output.setSpan(ForegroundColorSpan(placeHolderTextColor), start, start + textToPutAsPlaceHolder.length, 0)
                    }
                }
            }
        })
        textView.text = textToShow

E il risultato:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.