Ist es möglich, mehrere Stile für verschiedene Textteile in einer Textansicht festzulegen?
Zum Beispiel setze ich den Text wie folgt:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Ist es möglich, für jedes Textelement einen anderen Stil zu haben? ZB Zeile1 fett, Wort1 kursiv usw.
Die allgemeinen Aufgaben und die Vorgehensweise des Entwicklerhandbuchs in Android umfassen das Auswählen, Hervorheben oder Stylen von Textteilen :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Dabei werden jedoch explizite Positionsnummern im Text verwendet. Gibt es einen saubereren Weg, dies zu tun?
Antworten:
Für den Fall, dass sich jemand fragt, wie das geht, gibt es eine Möglichkeit: (Nochmals vielen Dank an Mark!)
Eine inoffizielle Liste der von dieser Methode unterstützten Tags finden Sie unter diesem Link oder in dieser Frage: Welche HTML-Tags werden von Android TextView unterstützt?
quelle
formatTextWhite(string text)
der der Text nur in die folgende Formatzeichenfolge eingefügt wird :"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Ich erinnere mich, dass das vor einiger Zeit für mich funktioniert hat. Ich bin mir nicht sicher, ob es noch funktioniert.Html.fromHtml("<font color=\"#999999\">
die Fluchtsequenzen haben für mich funktioniert :) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
keine Ahnung dankeVersuchen Sie es
Html.fromHtml()
und markieren Sie Ihren Text mit fetten und kursiven HTML-Tags, z.quelle
monthText + " " + month.getYearLabel()
. SieheStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
wenn Sie die einzelnen Teile nicht benötigen.Etwas abseits des Themas, aber ich fand das zu nützlich, um hier nicht erwähnt zu werden.
Was ist, wenn wir den HTML-Text aus der Ressource string.xml lesen und so die Lokalisierung vereinfachen möchten ? CDATA machen dies möglich:
Aus unserem Java-Code könnten wir ihn jetzt folgendermaßen verwenden:
Ich hatte nicht erwartet, dass das funktioniert. Aber es tat es.
Hoffe, es ist nützlich für einige von euch!
quelle
"@string/someText"
(wobei "someText" eine in einer Zeichenfolge.xml definierte Ressource ist), erhalte ich nur die Zeichenfolge mit allen HTML-Tags als "Text".Wenn Sie keine Lust auf HTML haben, können Sie einfach eine styles.xml erstellen und wie folgt verwenden:
quelle
$1%s is a happy $2%s
in String-Bundles. Sie müssen zulassen, dass die Token neu angeordnet werden.Es ist leichter, ein
SpannableString
anstelle von HTML-Markup zu verwenden. Es hilft mir, visuelle Beispiele zu sehen, daher hier eine ergänzende Antwort.Dies ist eine Single
TextView
.Weitere Studie
Dieses Beispiel wurde ursprünglich von hier inspiriert .
quelle
Die Liste der unterstützten Tags lautet:
(Von http://developer.android.com/guide/faq/commontasks.html#selectingtext - Webarchiv-Link ist
<resource>
Tippfehler im Original!)Es zeigt auch, dass dies
Html.fromHtml
in einfachen Fällen nicht wirklich benötigt wird.quelle
Ich hatte das gleiche Problem. Ich könnte fromHtml verwenden, aber ich bin jetzt Android, nicht Web, also habe ich beschlossen, dies auszuprobieren. Ich muss dies allerdings lokalisieren, also habe ich es mit dem String-Ersatz-Konzept versucht. Ich habe den Stil in der Textansicht als Hauptstil festgelegt und dann nur die anderen Teile formatiert.
Ich hoffe, dies hilft anderen, die das Gleiche tun möchten - ich weiß nicht, warum dies im Framework nicht einfacher ist.
Meine Saiten sehen so aus:
Hier sind die Stile:
Hier ist mein Code, der meine formatStyles-Methode aufruft:
Die Formatierungsmethode:
quelle
Jetzt ist das
<b>
Element veraltet.<strong>
rendert als<b>
und<em>
rendert als<i>
.Das funktioniert gut für mich
quelle
Hier ist eine einfache Möglichkeit, dies mit HTMLBuilder zu tun
Ergebnis:
Einige fette Texte Einige kursive Texte
quelle
Wenn Sie den gestalteten Text in XML hinzufügen möchten, können Sie eine benutzerdefinierte Ansicht erstellen, die TextView erweitert, und setText () überschreiben:
Dann können Sie es wie folgt verwenden (durch
PACKAGE_NAME
Ihren Paketnamen ersetzen ):quelle
Wie angegeben, verwenden
TextView.setText(Html.fromHtml(String))
Und verwenden Sie diese Tags in Ihrer HTML-formatierten Zeichenfolge:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
quelle
Ich auch
Wie wäre es mit einem schönen Markup mit Kotlin und Anko -
quelle
Ja, es ist möglich mit
SpannedString
. Wenn Sie Kotlin verwenden, wird die Verwendung noch einfachercore-ktx
, da hierfür eine domänenspezifische Sprache (DSL) bereitgestellt wird:Weitere Optionen sind:
Endlich können Sie einfach:
quelle
Mit Ausnahme des HTML-Objekts können Sie auch die Spannable-Typklassen verwenden, z. B. TextAppearanceSpan oder TypefaceSpan und SpannableString zusammen. Die HTML-Klasse verwendet diese Mechanismen ebenfalls. Mit den Spannable-Typklassen haben Sie jedoch mehr Freiheit.
quelle
Es kann so einfach sein, wie die Methode length () des Strings zu nutzen:
Teilen Sie die Textzeichenfolge in der Strings-XML-Datei in so viele Unterzeichenfolgen (aus Sicht von Android eine separate Zeichenfolge) auf, wie viele verschiedene Stile benötigen. Es könnte also so aussehen: str1, str2, str3 (wie in Ihrem Fall), Wenn sie zusammengefügt werden, ist dies die gesamte einzelne Zeichenfolge, die Sie verwenden.
Und dann folgen Sie einfach der "Span" -Methode, genau wie Sie es mit Ihrem Code dargestellt haben. Kombinieren Sie jedoch anstelle einer einzelnen Zeichenfolge alle Teilzeichenfolgen, die sie zu einer einzigen zusammenführen, die jeweils einen anderen benutzerdefinierten Stil haben.
Sie verwenden die Zahlen immer noch, jedoch nicht direkt - sie haben jetzt keine fest codierte Form mehr (wie in Ihrem Code), sondern werden durch die kombinierten length () -Methoden ersetzt (beachten Sie zwei Sterne vor und mit dem Suffix str. Länge () anstelle der absoluten Zahl, um die Änderung auszulöschen):
für die erste Zeichenfolgengröße dann str.length () + 1, str.length () + str2.length () für die zweite Zeichenfolgengröße usw. mit allen Teilzeichenfolgen anstelle von z. B. 0,7 oder 8,19 und so weiter...
quelle
Verwenden einer zusätzlichen überspannbaren Klasse als Android String Resources- Freigabe am Ende der Webseite. Sie können dies erreichen,
CharSquences
indem Sie ihnen einen Stil erstellen und geben.Aber in dem Beispiel, das sie uns geben, ist nur für fett, kursiv und sogar kolorieren Text. Ich musste mehrere Stile in a
CharSequence
einschließen, um sie in a zu setzenTextView
. Also habe ich dieser Klasse (ich habe sie genanntCharSequenceStyles
) gerade diese Funktion hinzugefügt.Und in der Ansicht habe ich dies hinzugefügt.
Ich hoffe das hilft dir!
quelle
Spanny vereinfacht die Verwendung von SpannableString.
quelle
Wie Jon sagte , ist dies für mich die beste Lösung und Sie müssen zur Laufzeit keinen Text festlegen. Verwenden Sie nur diese benutzerdefinierte Klasse HtmlTextView
und das wars, jetzt nur noch in dein XML
mit Ihrem HTML-String
quelle