Ich möchte wie unten auf eine Zeichenfolge aus einer anderen Zeichenfolge in meiner Datei strings.xml verweisen (beachten Sie insbesondere das Ende des Zeichenfolgeninhalts "message_text"):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="button_text">Add item</string>
<string name="message_text">You don't have any items yet! Add one by pressing the \'@string/button_text\' button.</string>
</resources>
Ich habe die obige Syntax ausprobiert, aber dann druckt der Text den "@ string / button_text" als Klartext aus. Nicht was ich will. Ich möchte, dass der Nachrichtentext gedruckt wird: "Sie haben noch keine Artikel! Fügen Sie einen hinzu, indem Sie auf die Schaltfläche" Artikel hinzufügen "klicken."
Gibt es einen bekannten Weg, um das zu erreichen, was ich will?
RATIONALE:
Meine Anwendung enthält eine Liste mit Elementen. Wenn diese Liste jedoch leer ist, wird stattdessen eine Textansicht "@android: id / empty" angezeigt. Der Text in dieser Textansicht soll den Benutzer darüber informieren, wie ein neues Element hinzugefügt wird. Ich möchte mein Layout für Änderungen narrensicher machen (ja, ich bin der fragliche Dummkopf :-)
Antworten:
Eine gute Möglichkeit, eine häufig verwendete Zeichenfolge (z. B. den App-Namen) in XML einzufügen, ohne Java-Code zu verwenden: source
AKTUALISIEREN:
Sie können Ihre Entität sogar global definieren, z.
res / raw / entity.ent:
res / values / string.xml:
quelle
Es ist möglich, ineinander zu referenzieren, solange Ihre gesamte Zeichenfolge aus dem Referenznamen besteht. Zum Beispiel wird dies funktionieren:
Dies ist noch nützlicher zum Festlegen von Standardwerten:
Jetzt können Sie
string_default
überall in Ihrem Code verwenden und die Standardeinstellung jederzeit problemlos ändern.quelle
Ich denke du kannst nicht. Sie können eine Zeichenfolge jedoch nach Ihren Wünschen "formatieren":
Im Code:
quelle
String text = res.getString(R.string.message_text, res.getString(R.string.button_text));
ist ein bisschen sauberer.In Android können Sie Strings nicht in XML verketten
Folgendes wird nicht unterstützt
Überprüfen Sie diesen Link unten, um zu erfahren, wie Sie dies erreichen können
Wie verkette ich mehrere Strings in Android XML?
quelle
Ich habe ein einfaches Gradle- Plugin erstellt , mit dem Sie eine Zeichenfolge von einer anderen referenzieren können. Sie können auf Zeichenfolgen verweisen, die in einer anderen Datei definiert sind, z. B. in einer anderen Build-Variante oder Bibliothek. Nachteile dieses Ansatzes - IDE Refactor findet solche Referenzen nicht.
Verwenden Sie die
{{string_name}}
Syntax, um auf eine Zeichenfolge zu verweisen:Um das Plugin zu integrieren, fügen Sie einfach den nächsten Code in die
build.gradle
Datei auf App- oder Bibliotheksmodulebene einUPDATE: Die Bibliothek funktioniert nicht mit dem Android Gradle Plugin Version 3.0 und höher, da die neue Version des Plugins aapt2 verwendet, das Ressourcen in das flache Binärformat packt, sodass gepackte Ressourcen für die Bibliothek nicht verfügbar sind. Als vorübergehende Lösung können Sie aapt2 deaktivieren, indem Sie android.enableAapt2 = false in Ihrer Datei gradle.properties festlegen.
quelle
> Could not get unknown property 'referencedString'
Sie können Ihre eigene Logik verwenden, die die verschachtelten Zeichenfolgen rekursiv auflöst.
Von einem
Activity
zum Beispiel nennt es gerne soquelle
Ich bin mir bewusst, dass dies ein älterer Beitrag ist, aber ich wollte die schnelle und schmutzige Lösung teilen, die ich für ein Projekt von mir gefunden habe. Es funktioniert nur für TextViews, kann aber auch an andere Widgets angepasst werden. Beachten Sie, dass der Link in eckigen Klammern stehen muss (z
[@string/foo]
. B. ).Der Nachteil dieses Ansatzes ist, dass
setText()
dasCharSequence
in a konvertiert wird. DiesString
ist ein Problem, wenn Sie Dinge wie a übergebenSpannableString
. Für mein Projekt war dies kein Problem, da ich es nur dafür verwendet habe,TextViews
dass ich nicht von meinem aus darauf zugreifen mussteActivity
.quelle
Mit der neuen Datenbindung können Sie Ihre XML-Datei verketten und noch viel mehr tun.
Wenn Sie beispielsweise Nachricht1 und Nachricht2 erhalten haben, können Sie:
Sie können sogar einige Text-Utils importieren und String.format und Freunde aufrufen.
Wenn Sie es an mehreren Stellen wiederverwenden möchten, kann es leider unordentlich werden. Sie möchten diese Codeteile nicht überall haben. und Sie können sie nicht in XML an einer Stelle definieren (nicht die ich kenne), damit Sie eine Klasse erstellen können, die diese Kompositionen einkapselt:
dann können Sie es stattdessen verwenden (Sie müssen die Klasse mit Datenbindung importieren)
quelle
Zusätzlich zu der obigen Antwort von Francesco Laurita https://stackoverflow.com/a/39870268/9400836
Es scheint, dass ein Kompilierungsfehler "& entity; wurde referenziert, aber nicht deklariert" vorliegt, der durch Verweisen auf die externe Deklaration wie folgt behoben werden kann
res / raw / entity.ent
res / values / strings.xml
Obwohl es kompiliert und ausgeführt wird, hat es einen leeren Wert. Vielleicht weiß jemand, wie man das löst. Ich hätte einen Kommentar gepostet, aber die Mindestreputation beträgt 50.
quelle
Sie können String-Platzhalter (% s) verwenden und diese zur Laufzeit mit Java ersetzen
und in Java
und setzen Sie es dann an die Stelle, an der die Zeichenfolge verwendet wird
quelle
%1$s
,%2$s
etc. statt%s
.Ich habe eine kleine Bibliothek erstellt, mit der Sie diese Platzhalter zur Erstellungszeit auflösen können, sodass Sie keinen Java / Kotlin-Code hinzufügen müssen, um das zu erreichen, was Sie möchten.
Anhand Ihres Beispiels müssten Sie Ihre Zeichenfolgen wie folgt einrichten:
Und dann kümmert sich das Plugin um Folgendes:
Es funktioniert auch für lokalisierte Zeichenfolgen und Flavour-Zeichenfolgen. Außerdem werden die generierten Zeichenfolgen immer aktualisiert, wenn Sie Änderungen an Ihren Vorlagen oder deren Werten vornehmen.
Weitere Informationen hier: https://github.com/LikeTheSalad/android-string-reference
quelle