Stringressourcen

Eine Stringressource stellt Textstrings für Ihre Anwendung bereit mit optionaler Textstile und ‐formatierung. Es gibt drei Arten von Ressourcen, Ihrer Anwendung mit Zeichenfolgen:

String
XML-Ressource, die einen einzelnen String bereitstellt.
String-Array
XML-Ressource, die ein Array von Strings bereitstellt.
Mengenstrings (Plurale)
XML-Ressource, die verschiedene Strings für die Pluralbildung enthält.

Auf alle Strings können bestimmte Stil-Markup- und Formatierungsargumente angewendet werden. Für Informationen zum Gestalten und Formatieren von Strings finden Sie im Abschnitt Formatierung und Stile.

String

Ein einzelner String, auf den von der Anwendung oder anderen Ressourcendateien verwiesen werden kann (z. B. als XML-Layout.

Hinweis:Ein String ist eine einfache Ressource, auf die verwiesen wird. Verwenden Sie dazu den im Attribut name angegebenen Wert (nicht den Namen der XML-Datei). Sie können also Zeichenfolgenressourcen mit anderen einfachen Ressourcen in der einen XML-Datei kombinieren, unter einem <resources>-Element.

Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Der name des <string>-Elements wird als Ressourcen-ID.
Datentyp der kompilierten Ressource:
Ressourcenzeiger auf eine String.
Ressourcenreferenz:
In Java: R.string.string_name
In XML:@string/string_name
Syntax:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string
        name="string_name"
        >text_string</string>
</resources>
Elemente:
<resources>
Erforderlich. Dies muss der Stammknoten sein.

Keine Attribute.

<string>
Ein String, der Stil-Tags enthalten kann. Vorsicht: Sie müssen den Apostrophe entkommen Anführungszeichen. Weitere Informationen zur richtigen Formatierung und Formatierung von Strings finden Sie unten im Abschnitt Formatierung und Stile.

Attribute:

name
String. Ein Name für den String. Dieser Name wird als Ressource verwendet, ID.
Beispiel:
XML-Datei gespeichert unter res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello!</string>
</resources>

Diese Layout-XML wendet einen String auf eine Ansicht an:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

Dieser Anwendungscode ruft einen String ab:

Kotlin

val string: String = getString(R.string.hello)

Java

String string = getString(R.string.hello);

Sie können entweder getString(int) oder getText(int), um einen String abzurufen. getText(int) behält alle Rich-Text-Stile bei, die auf den String angewendet wurden.

String-Array

Ein Array von Strings, auf die in der Anwendung verwiesen werden kann.

Hinweis:Ein String-Array ist eine einfache Ressource, auf die verwiesen wird. Verwenden Sie dazu den im Attribut name angegebenen Wert (nicht den Namen der XML-Datei). Als Sie können Zeichenfolgenarray-Ressourcen mit anderen einfachen Ressourcen in der einen XML-Datei kombinieren. unter einem <resources>-Element.

Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Der name des <string-array>-Elements wird als Ressourcen-ID.
Datentyp der kompilierten Ressource:
Ressourcenzeiger auf ein Array aus String-Werten.
Ressourcenreferenz:
In Java: R.array.string_array_name
XML: @[package:]array/string_array_name
Syntax:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
        name="string_array_name">
        <item
            >text_string</item>
    </string-array>
</resources>
Elemente:
<resources>
Erforderlich. Dies muss der Stammknoten sein.

Keine Attribute.

<string-array>
Definiert ein Array von Strings. Enthält ein oder mehrere <item>-Elemente.

Attribute:

name
String. Ein Name für das Array. Dieser Name wird als Ressource verwendet, ID, um auf das Array zu verweisen.
<item>
Ein String, der Stil-Tags enthalten kann. Der Wert kann ein Verweis auf einen anderen String-Ressource. Muss einem <string-array>-Element untergeordnet sein. Achten Sie darauf, dass Sie den Apostrophen entkommen und Anführungszeichen. Im Abschnitt Formatieren und Stile unten finden Sie Informationen zu Informationen zum richtigen Stil und Format Ihrer Zeichenfolgen.

Keine Attribute.

Beispiel:
XML-Datei gespeichert unter res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
    </string-array>
</resources>

Dieser Anwendungscode ruft ein String-Array ab:

Kotlin

val array: Array<String> = resources.getStringArray(R.array.planets_array)

Java

Resources res = getResources();
String[] planets = res.getStringArray(R.array.planets_array);

Mengenzeichenfolgen (Pluralformen)

Verschiedene Sprachen haben unterschiedliche Regeln für die grammatische Übereinstimmung mit der Menge. Auf Englisch Beispiel: Die Menge 1 ist ein Sonderfall. Wir schreiben 1 Buch, aber für jede andere Stückzahl schreiben Sie „n Bücher“. Diese Unterscheidung zwischen Singular und Plural ist sehr verbreitet, aber andere und Sprachen feinere Unterscheidungen. Der vollständige von Android unterstützte Satz ist zero, one, two, few, many und other.

Die Regeln zur Entscheidung, welcher Fall für eine bestimmte Sprache und Menge verwendet werden soll, können sehr komplex sein. Daher bietet Android Ihnen Methoden wie Zum Auswählen getQuantityString() die richtige Ressource für Sie.

Früher hießen sie „Mengenstrings“ (und das auch in der API genannt wird), Strings sollten nur für Pluralformen verwendet werden. Es wäre ein Fehler, Mengenstrings zu verwenden, eine Art Gmail-Funktion wie "Posteingang" im Vergleich zu "Posteingang (12)" wenn es ungelesene Nachrichten gibt, Beispiel. Es mag praktisch erscheinen, Mengenstrings anstelle einer if-Anweisung zu verwenden, Es ist jedoch wichtig zu erwähnen, dass diese grammatikalischen Inhalte bei einigen Sprachen (wie etwa Chinesisch) nicht unterscheiden, sodass Sie immer den String other erhalten.

Die Auswahl des zu verwendenden Strings beruht ausschließlich auf grammatikalischen Notwendigkeiten. Im Englischen wird ein String für zero ignoriert, auch wenn die Menge 0 ist, weil 0 sich grammatikalisch nicht von 2 oder einer anderen Zahl mit Ausnahme von 1 ("null Bücher", "ein Buch", "zwei Bücher" usw.). Für Koreanisch ist dagegen nur der String other die jemals von mir verwendet wurden.

Lassen Sie sich auch nicht dadurch täuschen, dass two beispielsweise nur für Die Menge 2: Eine Sprache könnte verlangen, dass 2, 12, 102 (und so weiter) alle wie eins behandelt werden. die sich jedoch von anderen Größen unterscheiden. Verlassen Sie sich darauf, dass Ihr Übersetzer die Unterschiede kennt. auf denen die Sprache tatsächlich besteht.

Wenn Ihre Nachricht keine Mengennummer enthält, eignet sie sich wahrscheinlich nicht für eine Pluralform. Zum Beispiel wird im Litauisch die Singularform sowohl für 1 als auch für 101 verwendet, also wird „1 Buch“ ist übersetzt als „1 knyga“ und „101 Bücher“ übersetzt als „101 knyga“. In der Zwischenzeit „ein Buch“ ist „knyga“ und „viele Bücher“ ist „daug knygț“. Wenn eine englische Pluralnachricht „ein Buch“ enthält (Singular) und "viele Bücher" (Plural) ohne die tatsächliche Zahl, kann sie mit "knyga" übersetzt werden. (ein Buch)/"daug knygã" (viele Bücher), aber mit Regeln für Litauen, "knyga" wird angezeigt (ein einzelnes Buch), wobei zufällig die Zahl 101 lautet.

Mengenstrings können häufig vermieden werden, indem mengenneutrale Formulierungen verwendet werden, z. B. „Bücher: 1“. Das macht Ihr Leben und die wenn es für eure App akzeptabel ist.

Ab API 24 können Sie die wesentlich leistungsstärkere ICU MessageFormat verwenden .

Hinweis: Eine Pluralsammlung ist eine einfache Ressource, die Verweis auf den Wert im Attribut name (nicht der Name der XML-Datei) -Datei). So lassen sich Pluralformen mit anderen einfachen Ressourcen in einem XML-Datei unter einem <resources>-Element.

Dateispeicherort:
res/values/filename.xml
Der Dateiname ist beliebig. Der name des <plurals>-Elements wird als Ressourcen-ID.
Ressourcenreferenz:
In Java: R.plurals.plural_name
Syntax:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals
        name="plural_name">
        <item
            quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
            >text_string</item>
    </plurals>
</resources>
Elemente:
<resources>
Erforderlich. Dies muss der Stammknoten sein.

Keine Attribute.

<plurals>
Eine Sammlung von Strings, von denen ein String bereitgestellt wird, je nachdem, wie viel irgendetwas. Enthält ein oder mehrere <item>-Elemente.

Attribute:

name
String. Ein Name für das Stringpaar. Dieser Name wird als Ressourcen-ID.
<item>
Ein String im Plural oder Singular. Der Wert kann ein Verweis auf einen anderen String-Ressource. Muss einem <plurals>-Element untergeordnet sein. Beachten Sie, dass Sie Apostrophe und Anführungszeichen maskiert. Weitere Informationen finden Sie unter Formatierung und Stil unten finden Sie Informationen zur richtigen Formatierung und Formatierung von Strings.

Attribute:

quantity
Keyword: Ein Wert, der angibt, wann dieser String verwendet werden soll. Gültig -Werte, wobei einige Beispiele in Klammern stehen:
WertBeschreibung
zeroWenn die Sprache eine Sonderbehandlung der Zahl 0 erfordert (wie im Arabischen).
oneWenn die Sprache eine Sonderbehandlung von Zahlen wie Eins erfordert (z. B. bei der Zahl 1 in Englisch und in den meisten anderen Sprachen; im Russischen sind alle Zahlen, die auf 1 enden, aber nicht auf 11 enden) in dieser Klasse enthalten.
twoWenn die Sprache eine Sonderbehandlung von Zahlen wie zwei erfordert (z. B. 2 für Walisisch oder 102 für Slowenisch).
fewWenn die Formulierung eine Sonderbehandlung von „klein“ erfordert Zahlen (wie 2, 3 und 4 auf Tschechisch oder Zahlen, die auf 2, 3 oder 4 enden, aber nicht auf 12, 13 oder 14 auf Polnisch).
manyWenn Sprache eine besondere Behandlung von „Large“ erfordert (z. B. Zahlen, die auf 11–99 auf Maltesisch enden).
otherWenn die Sprache keine besondere Behandlung der angegebenen Menge erfordert, z. B. alle Zahlen auf Chinesisch oder 42 auf Englisch.
Beispiel:
XML-Datei gespeichert unter res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <!--
             As a developer, you should always supply "one" and "other"
             strings. Your translators will know which strings are actually
             needed for their language. Always include %d in "one" because
             translators will need to use %d for languages where "one"
             doesn't mean 1 (as explained above).
          -->
        <item quantity="one">%d song found.</item>
        <item quantity="other">%d songs found.</item>
    </plurals>
</resources>

XML-Datei gespeichert unter res/values-pl/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <plurals name="numberOfSongsAvailable">
        <item quantity="one">Znaleziono %d piosenkę.</item>
        <item quantity="few">Znaleziono %d piosenki.</item>
        <item quantity="other">Znaleziono %d piosenek.</item>
    </plurals>
</resources>

Verwendung:

Kotlin

val count = getNumberOfSongsAvailable()
val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)

Java

int count = getNumberOfSongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count);

Bei Verwendung der Methode getQuantityString() müssen Sie count zweimal übergeben, wenn Ihr String Folgendes enthält: Zeichenfolgenformatierung mit einer Zahl. Für den String %d songs found auswählt, wird mit dem ersten count-Parameter der entsprechende Pluralstring ausgewählt und Der zweite count-Parameter wird in den Platzhalter %d eingefügt. Wenn Ihre Pluralform Strings enthalten keine Stringformatierung. Der dritte Parameter muss nicht an getQuantityString übergeben werden.

Format und Stil

Hier sind ein paar wichtige Dinge, die Sie wissen sollten, Formatieren und gestalten Sie Ihre Stringressourcen.

Umgang mit Sonderzeichen

Wenn ein String Zeichen enthält, die in XML besonders verwendet werden, müssen Sie den Parameter gemäß den standardmäßigen XML/HTML-Escaping-Regeln verwenden. Wenn Sie einem Zeichen Escapezeichen die in Android eine besondere Bedeutung hat, verwenden Sie einen vorangestellten umgekehrten Schrägstrich.

Standardmäßig werden Sequenzen von Leerzeichen in Android zu einem einzelnen Leerzeichen minimiert. Sie können dies vermeiden, indem Sie den relevanten Teil des Strings in doppelte Anführungszeichen setzen. In diesem Fall Alle Leerzeichen (einschließlich neuer Zeilen) werden innerhalb des in Anführungszeichen gesetzten Bereichs beibehalten. Wenn Sie doppelte Anführungszeichen setzen, können Sie auch reguläre einfache Anführungszeichen ohne Escapezeichen verwenden.

Zeichen Maskierte(s) Formular(e)
@ \@
? \?
Neue Zeile \n
Tabulatortaste \t
U+XXXX Unicode-Zeichen \uXXXX
Einfaches Anführungszeichen (')

Eines der folgenden Elemente:

  • \'
  • Setzen Sie den gesamten String in doppelte Anführungszeichen. (z. B. "This'll work")
Doppeltes Anführungszeichen (") \"

Beachten Sie, dass es nicht möglich ist, den String in einfache Anführungszeichen zu setzen.

Leerräume werden ausgeblendet und Android-Escaping erfolgt nach Ressourcendatei als XML geparst. Das bedeutet, dass <string> &#32; &#8200; &#8195;</string> (Leerzeichen, Satzzeichen, Unicode-Em-Leerzeichen) werden alle zu einem einzelnen Leerzeichen minimiert. (" "), da es sich nach dem Parsen der Datei als XML-Datei ausschließlich um Unicode-Leerbereiche handelt. Wenn Sie diese Leerzeichen beibehalten möchten, können Sie sie entweder zitieren (<string>" &#32; &#8200; &#8195;"</string>) oder Android-Escaping verwenden, (<string> \u0032 \u8200 \u8195</string>)

Hinweis:Aus Sicht des XML-Parsers besteht kein Unterschied zwischen <string>"Test this"</string> und <string>&quot;Test this&quot;</string>. Beide Formen zeigt keine Anführungszeichen an, sondern löst Anführungszeichen aus, die Android-Leerzeichen beibehalten. praktischen Effekt).

Strings formatieren

Wenn Sie Ihre Strings formatieren müssen, setzen Sie dazu Ihre Formatargumente in die String-Ressource. wie die folgende Beispielressource zeigt.

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

In diesem Beispiel hat der Formatstring zwei Argumente: %1$s ist ein String und %2$d eine Dezimalzahl ist. Formatieren Sie dann den String durch Aufrufen von getString(int, Object...). Beispiel:

Kotlin

var text = getString(R.string.welcome_messages, username, mailCount)

Java

String text = getString(R.string.welcome_messages, username, mailCount);

Stile mit HTML-Markup

Sie können Ihren Strings mit HTML-Markup Stile hinzufügen. Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="welcome">Welcome to <b>Android</b>!</string>
</resources>

Die folgenden HTML-Elemente werden unterstützt:

  • Fett: <b>
  • Kursiv: <i>, <cite>, <dfn>, <em>
  • 25% größerer Text: <big>
  • 20% kleinerer Text: <small>
  • Für die Schriftart werden die folgenden Einstellungen festgelegt: <font face=”font_family“ color=”hex_color”>. Beispiele für Mögliche Schriftfamilien sind monospace, serif und sans_serif
  • Festbreitenschrift (Monospace-Schriftfamilie): <tt>
  • Durchgestrichen: <s>, <strike>, <del>
  • Unterstrichen: <u>
  • Hochgestellt: <sup>
  • Tiefgestellt: <sub>
  • Aufzählungspunkte: <ul>, <li>
  • Zeilenumbrüche: <br>
  • Division: <div>
  • CSS-Stil: <span style=”color|background_color|text-decoration”>
  • Abschnitte: <p dir=”rtl | ltr” style="...>>

Wenn Sie keine Formatierung anwenden, können Sie TextView-Text direkt festlegen, indem Sie setText(java.lang.CharSequence) In einigen Fällen können Sie jedoch möchten eine Textressource mit benutzerdefiniertem Stil erstellen, die auch als Formatstring verwendet wird. In der Regel funktioniert nicht, weil format(String, Object...) und Mit getString(int, Object...)-Methoden werden alle Stile entfernt aus dem String. Die Umgehung dieses Problems besteht darin, die HTML-Tags mit Escape-Zeichen Entitäten, die dann mit fromHtml(String) wiederhergestellt werden, nachdem die Formatierung erfolgt ist. Beispiel:

  1. Speichern Sie die Textressource mit benutzerdefiniertem Stil als String mit HTML-Escape-Zeichen:
    <resources>
      <string name="welcome_messages">Hello, %1$s! You have &lt;b>%2$d new messages&lt;/b>.</string>
    </resources>
    

    In diesem formatierten String wird ein <b>-Element hinzugefügt. Die öffnende Klammer Mit HTML-Escape-Zeichen unter Verwendung der &lt;-Notation.

  2. Formatieren Sie den String dann wie gewohnt, aber rufen Sie auch fromHtml(String) auf, Konvertieren Sie den HTML-Text in einen formatierten Text:

    Kotlin

    val text: String = getString(R.string.welcome_messages, username, mailCount)
    val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)
    

    Java

    String text = getString(R.string.welcome_messages, username, mailCount);
    Spanned styledText = Html.fromHtml(text, FROM_HTML_MODE_LEGACY);
    

Da mit der Methode fromHtml(String) alle HTML-Entitäten formatiert werden, müssen Sie alle möglichen HTML-Zeichen in den Zeichenfolgen, die Sie mit dem formatierten Text verwenden, mit htmlEncode(String). Wenn Sie beispielsweise eine Zeichenfolge formatieren, die Zeichen wie „<“ oder "&" eingeben, müssen sie vor der Formatierung mit Escape-Zeichen maskiert werden, damit bei der durch fromHtml(String) übergeben wird, sehen die Zeichen wie gewünscht aus. die ursprünglich geschrieben wurden. Beispiel:

Kotlin

val escapedUsername: String = TextUtils.htmlEncode(username)

val text: String = getString(R.string.welcome_messages, escapedUsername, mailCount)
val styledText: Spanned = Html.fromHtml(text, FROM_HTML_MODE_LEGACY)

Java

String escapedUsername = TextUtils.htmlEncode(username);

String text = getString(R.string.welcome_messages, escapedUsername, mailCount);
Spanned styledText = Html.fromHtml(text);

Stile mit Spannables

Ein Spannable ist ein Textobjekt, das Sie mit Schriftbildeigenschaften wie Farbe und Schriftstärke. Sie verwenden SpannableStringBuilder zum Erstellen Ihren Text und wenden Sie dann die in android.text.style definierten Stile an. an den Text übergeben.

Mit den folgenden Hilfsmethoden können Sie einen Großteil der Arbeit überspannenden Text erstellen:

Kotlin

/**
 * Returns a CharSequence that concatenates the specified array of CharSequence
 * objects and then applies a list of zero or more tags to the entire range.
 *
 * @param content an array of character sequences to apply a style to
 * @param tags the styled span objects to apply to the content
 *        such as android.text.style.StyleSpan
 */
private fun apply(content: Array<out CharSequence>, vararg tags: Any): CharSequence {
    return SpannableStringBuilder().apply {
        openTags(tags)
        content.forEach { charSequence ->
            append(charSequence)
        }
        closeTags(tags)
    }
}

/**
 * Iterates over an array of tags and applies them to the beginning of the specified
 * Spannable object so that future text appended to the text will have the styling
 * applied to it. Do not call this method directly.
 */
private fun Spannable.openTags(tags: Array<out Any>) {
    tags.forEach { tag ->
        setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK)
    }
}

/**
 * "Closes" the specified tags on a Spannable by updating the spans to be
 * endpoint-exclusive so that future text appended to the end will not take
 * on the same styling. Do not call this method directly.
 */
private fun Spannable.closeTags(tags: Array<out Any>) {
    tags.forEach { tag ->
    if (length > 0) {
            setSpan(tag, 0, length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        } else {
            removeSpan(tag)
        }
    }
}

Java

/**
 * Returns a CharSequence that concatenates the specified array of CharSequence
 * objects and then applies a list of zero or more tags to the entire range.
 *
 * @param content an array of character sequences to apply a style to
 * @param tags the styled span objects to apply to the content
 *        such as android.text.style.StyleSpan
 *
 */
private static CharSequence applyStyles(CharSequence[] content, Object[] tags) {
    SpannableStringBuilder text = new SpannableStringBuilder();
    openTags(text, tags);
    for (CharSequence item : content) {
        text.append(item);
    }
    closeTags(text, tags);
    return text;
}

/**
 * Iterates over an array of tags and applies them to the beginning of the specified
 * Spannable object so that future text appended to the text will have the styling
 * applied to it. Do not call this method directly.
 */
private static void openTags(Spannable text, Object[] tags) {
    for (Object tag : tags) {
        text.setSpan(tag, 0, 0, Spannable.SPAN_MARK_MARK);
    }
}

/**
 * "Closes" the specified tags on a Spannable by updating the spans to be
 * endpoint-exclusive so that future text appended to the end will not take
 * on the same styling. Do not call this method directly.
 */
private static void closeTags(Spannable text, Object[] tags) {
    int len = text.length();
    for (Object tag : tags) {
        if (len > 0) {
            text.setSpan(tag, 0, len, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            text.removeSpan(tag);
        }
    }
}

Die folgenden bold, italic und color -Methoden umschließen die oben genannten Hilfsmethoden und zeigen spezifische Beispiele für die im Paket android.text.style definierte Stile. Ich können ähnliche Methoden für andere Arten von Textstilen erstellen.

Kotlin

/**
 * Returns a CharSequence that applies boldface to the concatenation
 * of the specified CharSequence objects.
 */
fun bold(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.BOLD))

/**
 * Returns a CharSequence that applies italics to the concatenation
 * of the specified CharSequence objects.
 */
fun italic(vararg content: CharSequence): CharSequence = apply(content, StyleSpan(Typeface.ITALIC))

/**
 * Returns a CharSequence that applies a foreground color to the
 * concatenation of the specified CharSequence objects.
 */
fun color(color: Int, vararg content: CharSequence): CharSequence =
        apply(content, ForegroundColorSpan(color))

Java

/**
 * Returns a CharSequence that applies boldface to the concatenation
 * of the specified CharSequence objects.
 */
public static CharSequence bold(CharSequence... content) {
    return apply(content, new StyleSpan(Typeface.BOLD));
}

/**
 * Returns a CharSequence that applies italics to the concatenation
 * of the specified CharSequence objects.
 */
public static CharSequence italic(CharSequence... content) {
    return apply(content, new StyleSpan(Typeface.ITALIC));
}

/**
 * Returns a CharSequence that applies a foreground color to the
 * concatenation of the specified CharSequence objects.
 */
public static CharSequence color(int color, CharSequence... content) {
    return apply(content, new ForegroundColorSpan(color));
}

Hier ist ein Beispiel, wie diese Methoden verkettet werden können, um verschiedene Stile auf einzelne Wörter in einer Wortgruppe:

Kotlin

// Create an italic "hello, " a red "world",
// and bold the entire sequence.
val text: CharSequence = bold(italic(getString(R.string.hello)),
        color(Color.RED, getString(R.string.world)))

Java

// Create an italic "hello, " a red "world",
// and bold the entire sequence.
CharSequence text = bold(italic(getString(R.string.hello)),
    color(Color.RED, getString(R.string.world)));

Das Kotlin-Core-ktx-Modul enthält auch Erweiterungsfunktionen, die die Arbeit mit Spans noch einfacher zu machen. Weitere Informationen finden Sie in der <ph type="x-smartling-placeholder"></ph> android.text-Paketdokumentation auf GitHub.

Weitere Informationen zum Arbeiten mit Spans finden Sie unter den folgenden Links:

Stile mit Anmerkungen

Sie können komplexe oder benutzerdefinierte Stile anwenden, indem Sie die Annotation-Klasse zusammen mit dem <annotation>-Tag in Ihren Strings.xml-Ressourcendateien. Das Anmerkungs-Tag ermöglicht Sie können Teile des Strings für benutzerdefinierte Stile markieren, indem Sie benutzerdefinierte Schlüssel/Wert-Paare in der XML-Datei definieren. das das Framework dann in Annotation-Spans umwandelt. Diese können Sie dann Anmerkungen und wenden den Stil mithilfe des Schlüssels und des Werts an.

Beim Erstellen von Anmerkungen musst du <annotation> hinzufügen. -Tag zu allen Übersetzungen der Zeichenfolge in jeder Zeichenfolgen.xml-Datei hinzu.


Eine benutzerdefinierte Schriftart auf das Wort „Text“ in allen Sprachen anwenden

Beispiel – Benutzerdefiniertes Schriftbild hinzufügen

  1. Fügen Sie das Tag <annotation> hinzu und definieren Sie das Schlüssel/Wert-Paar. In diesem Fall Schlüssel ist font und der Wert ist die Art der Schriftart, die wir verwenden möchten: title_emphasis.

    // values/strings.xml
    <string name="title">Best practices for <annotation font="title_emphasis">text</annotation> on Android</string>
    
    // values-es/strings.xml
    <string name="title"><annotation font="title_emphasis">Texto</annotation> en Android: mejores prácticas</string>
    
  2. Laden Sie die Stringressource und suchen Sie die Anmerkungen mit dem Schlüssel font. Erstellen Sie dann benutzerdefinierten Span und den vorhandenen ersetzen.

    Kotlin

    // get the text as SpannedString so we can get the spans attached to the text
    val titleText = getText(R.string.title) as SpannedString
    
    // get all the annotation spans from the text
    val annotations = titleText.getSpans(0, titleText.length, Annotation::class.java)
    
    // create a copy of the title text as a SpannableString.
    // the constructor copies both the text and the spans. so we can add and remove spans
    val spannableString = SpannableString(titleText)
    
    // iterate through all the annotation spans
    for (annotation in annotations) {
       // look for the span with the key font
       if (annotation.key == "font") {
          val fontName = annotation.value
          // check the value associated to the annotation key
          if (fontName == "title_emphasis") {
             // create the typeface
             val typeface = getFontCompat(R.font.permanent_marker)
             // set the span at the same indices as the annotation
             spannableString.setSpan(CustomTypefaceSpan(typeface),
                titleText.getSpanStart(annotation),
                titleText.getSpanEnd(annotation),
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
          }
       }
    }
    
    // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan
    styledText.text = spannableString
    

    Java

    // get the text as SpannedString so we can get the spans attached to the text
    SpannedString titleText = (SpannedString) getText(R.string.title);
    
    // get all the annotation spans from the text
    Annotation[] annotations = titleText.getSpans(0, titleText.length(), Annotation.class);
    
    // create a copy of the title text as a SpannableString.
    // the constructor copies both the text and the spans. so we can add and remove spans
    SpannableString spannableString = new SpannableString(titleText);
    
    // iterate through all the annotation spans
    for (Annotation annotation: annotations) {
      // look for the span with the key font
      if (annotation.getKey().equals("font")) {
        String fontName = annotation.getValue();
        // check the value associated to the annotation key
        if (fontName.equals("title_emphasis")) {
        // create the typeface
        Typeface typeface = ResourcesCompat.getFont(this, R.font.roboto_mono);
        // set the span at the same indices as the annotation
        spannableString.setSpan(new CustomTypefaceSpan(typeface),
          titleText.getSpanStart(annotation),
          titleText.getSpanEnd(annotation),
          Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
      }
    }
    
    // now, the spannableString contains both the annotation spans and the CustomTypefaceSpan
    styledText.text = spannableString;
    

Wenn Sie denselben Text mehrmals verwenden, sollten Sie die Methode SpannableString-Objekt einmalig und verwenden Sie es nach Bedarf wieder, um Leistung und Arbeitsspeicher zu vermeiden. Probleme.

Weitere Beispiele für die Verwendung von Annotationen finden Sie unter <ph type="x-smartling-placeholder"></ph> Internationalisierten Text in Android gestalten

Anmerkungsspannen und Textparzelle

Da Annotation-Spans ebenfalls ParcelableSpans sind, ist das Schlüssel/Wert-Paar Paar- und Paketzustände enthalten. Solange der Empfänger des Pakets weiß, wie es Anmerkungen, können Sie mit Annotation-Spans einen benutzerdefinierten Stil auf die gespitzten Text.

Wenn Sie den benutzerdefinierten Stil beibehalten möchten, wenn Sie den Text an ein Intent-Bundle übergeben, müssen Sie zuerst Annotation erstreckt sich bis zu Ihrem Text. Dies können Sie in den XML-Ressourcen über die <Anmerkung> wie im obigen Beispiel gezeigt. Sie können auch im Code ein neues Tag erstellen, Annotation und legen Sie es wie unten gezeigt als Span fest:

Kotlin

val spannableString = SpannableString("My spantastic text")
val annotation = Annotation("font", "title_emphasis")
spannableString.setSpan(annotation, 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

// start Activity with text with spans
val intent = Intent(this, MainActivity::class.java)
intent.putExtra(TEXT_EXTRA, spannableString)
startActivity(intent)

Java

SpannableString spannableString = new SpannableString("My spantastic text");
Annotation annotation = new Annotation("font", "title_emphasis");
spannableString.setSpan(annotation, 3, 7, 33);

// start Activity with text with spans
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(TEXT_EXTRA, spannableString);
this.startActivity(intent);

Rufen Sie den Text aus dem Bundle als SpannableString ab und parsen Sie ihn die angehängten Anmerkungen, wie im obigen Beispiel gezeigt.

Kotlin

// read text with Spans
val intentCharSequence = intent.getCharSequenceExtra(TEXT_EXTRA) as SpannableString

Java

// read text with Spans
SpannableString intentCharSequence = (SpannableString)intent.getCharSequenceExtra(TEXT_EXTRA);

Weitere Informationen zu Textstilen finden Sie unter den folgenden Links: