Wie verwende ich String-Ressourcen in Android Jetpack Compose?

Lesezeit: 3 Minuten

Benutzeravatar von Valeriy Katkov
Valeriy Katkov

Lassen Sie uns Folgendes haben strings.xml Ressourcendatei:

<resources>
    <!-- basic string -->
    <string name="app_name">My Playground</string>

    <!-- basic string with an argument -->
    <string name="greeting">Hello %!</string>

    <!-- plural string -->
    <plurals name="likes">
        <item quantity="one">%1d like</item>
        <item quantity="other">%1d likes</item>
    </plurals>

    <!-- string array -->
    <string-array name="planets">
        <item>Earth</item>
        <item>Mars</item>
    </string-array>
</resources>

Wie kann ich diese Ressourcen in Jetpack Compose nutzen?

Benutzeravatar von Valeriy Katkov
Valeriy Katkov

Es gibt androidx.compose.ui.res Paket, das Funktionen zum Laden von String-Ressourcen sowie anderen Ressourcentypen enthält.

Zeichenfolge

Sie können eine Zeichenfolge erhalten mit stringResource() Funktion, zum Beispiel:

...
import androidx.compose.ui.res.stringResource

@Composable
fun StringResourceExample() {
  Text(
    // a string without arguments
    text = stringResource(R.string.app_name)
  )

  Text(
    // a string with arguments
    text = stringResource(R.string.greeting, "World")
  )
}

String-Array

Kann erhalten werden mit stringArrayResource() Funktion:

val planets = stringArrayResource(R.array.planets_array)

Plural (Mengenzeichenfolge)

Zum Zeitpunkt des Verfassens 1.0.0-alpha10 Es gibt keine integrierte Funktion zum Abrufen einer Pluralressource, aber Sie können den Android-Kontext über abrufen LocalContext und verwenden Sie es auf die gleiche Weise wie in einer ansichtsbasierten App. Noch besser, wenn Sie Ihre eigene Funktion erstellen, die anderen ähnelt Ressourcenfunktionen (wie Jetcaster Beispiel komponieren funktioniert zum Beispiel):

// PluralResources.kt

package com.myapp.util

import androidx.annotation.PluralsRes
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext

@Composable
fun quantityStringResource(@PluralsRes id: Int, quantity: Int, vararg formatArgs: Any): String {
    return LocalContext.current.resources.getQuantityString(id, quantity, *formatArgs)
}

Sie können es also genauso verwenden:

val likes = quantityStringResource(R.plurals.likes, 10, 10)

eine Anmerkung zur Neukomposition

Wie Sie wissen, kann eine zusammensetzbare Funktion in Compose bis zu hunderte Male pro Sekunde erneut ausgeführt werden Neuzusammensetzung. Wenn die von Ihnen erstellte Zeichenfolge nicht trivial ist und einige Berechnungen erfordert, ist es besser, dies zu tun erinnern das Berechnungsergebnis, sodass es nicht bei jeder Neuzusammenstellung erneut ausgeführt wird. Zum Beispiel:

...

import androidx.compose.runtime.remember

@Composable
fun BirthdayDateComposable(username: String, dateMillis: Long) {
  // formatDate() function will be executed only if dateMillis value 
  // is changed, otherwise the remembered value will be used
  val dateStr = remember(dateMillis) {
    formatDate(dateMillis)
  }

  Text(
    text = stringResource(R.string.birthday_date, dateStr)
  )
}

  • Was die Neuzusammensetzung angeht, sind Sie sicher? remember wäre in diesem Beispiel nötig? Der offizielle Dokumentation schlägt vor, dass eine zusammensetzbare Funktion nicht neu zusammengesetzt wird, wenn ihre Parameter gleich bleiben: „Durch das Überspringen aller Funktionen oder Lambdas, die keine geänderten Parameter haben, kann Compose effizient neu zusammensetzen.“

    – Jonik

    15. September 2021 um 8:42 Uhr


Dies wird jetzt ab Compose unterstützt 1.2.0-alpha06:

val likes = pluralStringResource(R.plurals.likes, 10, 10)

  • Können Sie mitteilen, wie Sie die Zeichenfolge in plurals.xml definiert haben?

    – Wafi_ck

    25. April 2022 um 12:34 Uhr

  • @Wafi_ck Ich habe meine Pluralformen in strings.xml eingefügt, und zwar in genau derselben Syntax wie in der ursprünglichen Frage.

    – lt0

    28. April 2022 um 0:25

  • Jetzt ist es in 1.2 erschienen 🙂

    – DamienL

    28. Juli 2022 um 12:39 Uhr


Benutzeravatar von Benjamin Sinzore
Benjamin Sinzore

Hier ist ein Beispiel:

Text(text = stringResource(id = R.string.myString)

1453110cookie-checkWie verwende ich String-Ressourcen in Android Jetpack Compose?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy