Unterschiedliche Schriftgröße von Zeichenfolgen in derselben Textansicht


140

Ich habe ein textViewInneres mit einer Zahl (Variable) und einem string, wie kann ich der Zahl eine Nummer größer als die geben string? der Code:

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

Ich möchte, dass ls.numproducts eine andere Größe hat als der Rest des Textes. Wie macht man?

Antworten:


357

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

Schnappschuss

Geben Sie hier die Bildbeschreibung ein

Sie können die Zeichenfolge mit Leerzeichen teilen und der gewünschten Zeichenfolge eine Spanne hinzufügen.

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

Wenden Sie sich nun spanan stringund fügen Sie dasselbe hinzutextview .


setSpan () return: java.lang.IndexOutOfBoundsException: setSpan (0 ... 5) endet über Länge 1 hinaus. Was bedeutet das?
Adriana Carelli

Überprüfen Sie die Länge der Zeichenfolge. IndexOutOfBoundsException: Zeigt eine falsche Indexposition für Anfang und Ende der Spanne an. in der obigen Hallo Länge ist 5, also habe ich die Spanne von Index 0 bis 5 angewendet
Raghunandan

Hat bei Google Glass perfekt funktioniert!
Mohammad Arman

2
Gibt es eine Möglichkeit, die kleinen Zeichen in vertikaler Richtung in die Mitte zu verschieben? Grundsätzlich sollten alle Zeichen unabhängig von der Größe vertikal zentriert sein.
500865

In diesem Fall benötigen Sie wahrscheinlich zwei Textansichten, oder Sie müssen Ihre eigene
Textansicht

119

Nur für den Fall, dass Sie sich fragen, wie Sie mehrere verschiedene Größen in derselben Textansicht festlegen können, aber eine absolute Größe und keine relative verwenden können, können Sie dies AbsoluteSizeSpananstelle von a erreichen RelativeSizeSpan.

Erhalten Sie einfach die Dimension in Pixel der gewünschten Textgröße

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

und erstellen Sie dann eine neue AbsoluteSpanbasierend auf dem Text

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

Gute Ergänzung mit AbsoluteSizeSpanBeispiel
Eugenek

@AmitGarg möchten Sie näher erläutern?
Joao Sousa

4
Sie können auch verwenden AbsoluteSizeSpan(sizeInDip, true), um Größe direkt in dp anzugeben
Ilia Grabko

8

Sie können dies mithilfe einer HTML-Zeichenfolge erledigen und die HTML-Datei mithilfe von HTML auf Textansicht setzen
txtView.setText(Html.fromHtml("Your html string here"));

Zum Beispiel :

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

1
Schöner Beitrag! Ab jetzt ist HTML (API> = N) jedoch veraltet. Damit dies funktioniert, müssen Sie den Kompatibilitätsmodus zulassen: if (android.os.Build.VERSION.SDK_INT> = android.os.Build.VERSION_CODES.N) {txtView.setText (Html.fromHtml ("Ihre HTML-Zeichenfolge")) , Html.FROM_HTML_MODE_LEGACY)); } else {txtView.setText (Html.fromHtml ("Ihre HTML-Zeichenfolge")); }
statosdotcom

Was ist die Einheit von "5"? Ist es dp? Ist es sp? Wie kann ich es ändern?
Android-Entwickler

5

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

mit

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

Geben Sie hier die Bildbeschreibung ein

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

mit

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

Geben Sie hier die Bildbeschreibung ein



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

---------------- Ergebnis ---------------

Ergebnis:

12345. 24


2

Der beste Weg, dies zu tun, ist HTML, ohne Ihren Text zu unterzeichnen und vollständig zu dynamisieren. Zum Beispiel:

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

    }

und Sie können Farbattribut usw. verwenden, wenn andererseits:

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

1

Ich habe meine eigene Funktion geschrieben, die 2 Zeichenfolgen und 1 int (Textgröße) benötigt.

Der vollständige Text und der Teil des Textes, dessen Größe Sie ändern möchten.

Es gibt einen SpannableStringBuilder zurück, den Sie in der Textansicht verwenden können.

  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

Für den Fall, dass Sie zu viel Verwirrung für Ihre Übersetzer vermeiden möchten, habe ich mir eine Möglichkeit ausgedacht, nur einen Platzhalter in den Zeichenfolgen zu haben, der im Code behandelt wird.

Angenommen, Sie haben dies in den Saiten:

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

Wenn Sie möchten, dass der Platzhaltertext eine andere Größe und Farbe hat, können Sie Folgendes verwenden:

        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

Und das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.