Lokalisierung: Variablen in String übergeben

  • Antworten:16
  • OffenNicht stickyBentwortet

27.04.2011 23:01:08 via Website

Hi,

ich bin gerade dabei meine App zu lokalisieren und will das, was im Moment noch als setText(); im Code steht, in die strings.xml auslagern.
strings.xml:
1<string name="description">Teststring Variable: %d .</string>

Java-Datei:
1TextView description = (TextView) findViewById(R.id.description);
2Resources res = getResources();
3description.setText(res.getString(R.string.description, 15));

Damit ist die Ausgabe der TextView :
1Teststring Variable: 15 .
.

So weit, so gut.

Jetzt möchte ich aber statt der 15 eine Variable übergeben. Wenn ich aber
1description.setText(res.getString(R.string.description, var));
schreibe gehts nicht, die App stürzt einfach ab.
Das passiert im Log:
104-27 20:56:34.889: DEBUG/AndroidRuntime(355): Shutting down VM
204-27 20:56:34.889: WARN/dalvikvm(355): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
304-27 20:56:34.899: ERROR/AndroidRuntime(355): Uncaught handler: thread main exiting due to uncaught exception
404-27 20:56:34.919: ERROR/AndroidRuntime(355): java.util.IllegalFormatConversionException: d is incompatible with java.lang.Double
504-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter$Transformer.transformFromInteger(Formatter.java:1610)
604-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter$Transformer.transform(Formatter.java:1259)
704-27 20:56:34.919: ERROR/AndroidRuntime(355): at java.util.Formatter.format(Formatter.java:948)
8.
9.
10.
11.
Der markierten Zeile entnehme ich, dass ich für eine Double Variable einen anderen Buchstaben nehmen muss, aber welchen?
In der Android Doc finde ich nichts passendes.

Danke schonmal
Ludwig

27.04.2011 23:52:33 via Website

Hi,
die Frage ist nun halt von welchem Typ deine Variable ist.
Wenn du in der entsprechenden XML-Datei den Platzhalter %d benutzt muss eine Dezimalzahl sein.
Wenn du %s als Platzhalter nutzt muss die Variable ein String sein.
Schreibst du also ein String in den Platzhalter %d hängt sich die Anwendung weg.

Das einzige was ich so auf die Schnell zu diesem Thema gefunden habe ist folgendes dort dann Formatting strings wobei dort halt auch auf den Datentyp geachtet wird.

Hoffe ich konnte dir da etwas weiterhelfen.

Gruß,
Markus

28.04.2011 00:24:38 via Website

luhu
Wie oben geschrieben ist es eine Double Variable. Eine einfache Tabelle wo alle Buchstaben zu den Datentypen drin steht wäre klasse :)

trotzdem Danke!

Okay, ist schon spät, sry :)
So nun hab ich es aber verstanden ....
Also ist ganz einfach und ich habe ne Tabelle für dich :)
Wenn du dort ein bissel scrollst kannst du dir an schauen wie Formatter das unter Android macht.
Die selben Pattern kannst du in der XML-Konfiguration benutzten.
Somit wäre für dich z.B. das hier passen: %.2f -> Also eine floating point Variable mit zwei Nachkommastellen.

Gruß,
Markus

Gelöschter Account

28.04.2011 13:18:28 via Website

Nur so am Rande:

Solange Du Dich in einer Activity/ListActivity/... befindest benötigst Du nicht den Weg über die Resources. getString() ist im Context definiert und somit erben u.a. alle Activities davon. Also statt ...

1Resources res = getResources();
2description.setText(res.getString(R.string.description, 15));

Reicht ...

1description.setText(getString(R.string.description, 15));

Gruß
Harald

28.04.2011 14:40:29 via Website

Alles klar, danke euch. Klappt soweit.
Wie ist das jetzt, wenn ich noch mehr Variablen in den String übergeben will?

1description.setText(getString(R.string.description, var1, var2)); //Beides double variablen
1<string name="description">Teststring Variable1: %.2f Variable2: %.2f .</string>

So sollte es ja funktionieren, aber anscheinend, klappt das mit dem 2. %.2f nicht. die nachfolgenden Strings in der strings.xml werden nicht mehr erkannt...

28.04.2011 15:09:40 via Website

Das habe ich leider auch gehabt und nicht gelöst bekommen.
Hab auch in Foren Beschwerden von anderen darüber gefunden...scheint wohl eine Limitierung seit den neueren Versionen des SDK zu sein.
Man kann nur eine Variable pro String einbauen, sonst meckert der Resource Parser.

28.04.2011 15:55:31 via Website

Hi,
ich kann es atm nicht testen, da ich noch auf der Arbeit hänge aber du müsstest folgendes machen können:
1<string name="description">Teststring Variablen: %.2f %.2f </string>
2
3Resources res = getResources();
4String text = String.format(res.getString(R.string.description), double1, double2);
5description.setText(text);

Gruß,
Markus

28.04.2011 16:11:51 via Website

Danke für eure Lösungsvorschläge, aber das Problem ist in der strings.xml.
Er findet die nachfolgenden Strings nicht mehr, wenn ich 2 mal %.2f reinschreibe:
\res\menu\menu.xml:6: error: Error: No resource found that matches the given name (at 'title' with value '@string/share').

Gelöschter Account

28.04.2011 18:29:07 via Website

1. Du hast eine menu Ressource mit dem android:title="@string/share"?

2. Du hast eine string Ressource "share" mit welchem Text?

3. Diese string Ressource befindet sich auch im Ordner, und der Datei, der Default-Sprache (values, ohne Language Zusatz)?

4. Über dieser string Ressource hast Du nun einen String mit 2x %f?

Hmm, kontrolliere mal Position 3?

Gruß
Harald

28.04.2011 22:45:55 via Website

Hi,
also wenn ich folgendes mache:
1<string name="text" formatted="false">My Text %.2f and %.2f</string>
2
3final double d1 = 1.34;
4final double d2 = 2.34;
5textView.setText(getString(R.string.text, d1, d2));

Ist die Ausgabe in der textView: My Text 1.34 and 2.34

Das ist doch nun aber was du sucht oder ?

Gruß,
Markus

— geändert am 28.04.2011 22:46:16

29.04.2011 11:14:12 via Website

Markus B.
Hi,
also wenn ich folgendes mache:
1<string name="text" formatted="false">My Text %.2f and %.2f</string>
2
3final double d1 = 1.34;
4final double d2 = 2.34;
5textView.setText(getString(R.string.text, d1, d2));

Ist die Ausgabe in der textView: My Text 1.34 and 2.34

Das ist doch nun aber was du sucht oder ?

Gruß,
Markus

Ja genau, das suche ich.

Wenn ich das so mache, erkennt Eclipse aber die Strings, die in der strings.xml nach dem zweiten "%.2f" ist nicht mehr.
Muss man das formatted="false" mit reinnehmen? Liegt es daran?

EDIT: Das wars, wenn ich das formatted="false" mit reinnehme, geht alles! DANKESCHÖN! :)

— geändert am 29.04.2011 11:23:20