Problem mit setText und Platzhalter in strings.xml

  • Antworten:10
Holger K.
  • Forum-Beiträge: 7

03.08.2011, 17:02:02 via Website

Hallo,

ich beschäftige mich als Neuling gerade mit der App-Entwicklung unter Android. Ich kam bisher auch gut alleine klar aber eine Sache hat mich jetzt schon 2 Stunden googlen und Trial&Error gekostet aber ohne Ergebnis. Vielleicht sitze ich auch nur zu lange davor. Daher habe ich mich mal hier angemeldet und stelle meine Frage mal. Auch wenn sie vermutlich total einfach und dumm ist. Aber ohne fremde Hilfe komme ich einfach nicht mehr weiter.

Anhand meiner Codeschnipsel sollte ersichtlich sein, dass ich in der main.xml eine Textzeile habe, die Text aus der strings.xml enthalten soll. Das klappt auch 1a. Nun möchte ich den Platzhalter der strings.xml gerne durch einen Wert ersetzen, den ich direkt in der .java-Datei hinterlege und der später dynamisch sich ändern könnte. Aber die Verknüpfung zwischen setText und dem Platzhalter aus der strings.xml klappt nicht.

Fehlermeldung 1: Die Zeile mit String meintext scheint komplett falsch zu sein, die Meldung ist ziemlich lang...
Fehlermeldung 2: meintext cannot be resolved or is not a field

Wer es nicht für mich lösen möchte aber einen Link zur Hand hat, wo es erklärt ist, dem wäre ich ebenfalls unendlich dankbar. :-)

1main.xml
2
3 <TextView
4 android:id="@+id/Irgendwas"
5 android:text="@string/meintext"
6 android:layout_height="wrap_content"
7 android:layout_gravity="center"
8 android:layout_width="wrap_content">
9 </TextView>
10
11 strings.xml
12
13 <string name="meintext">Mein Text: %1$s</string>
14
15 MainActivity.java
16
17 public void onCreate(Bundle savedInstanceState) {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.main);
20
21 Resources res = getResources();
22 String meintext = res.getString(meintext);
23 meintext.setText(getString(R.string.meintext, "Test"));
24 }

Gruß
Holger

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

03.08.2011, 18:45:49 via Website

Das geht so nicht.

* Im main.xml wird android:text="@string/meintext" angesprochen - dieser String hat aber einen Platzhalter. Statisch im XML kannst Du keinen Wert für einen Platzhalter übergeben.

* Im Java:

1Resources res = getResources();
2String text = String.format(res.getString(R.string.meintext), "Test");

Antworten
Holger K.
  • Forum-Beiträge: 7

04.08.2011, 10:06:45 via Website

Admin Service Limited
Das geht so nicht.

* Im main.xml wird android:text="@string/meintext" angesprochen - dieser String hat aber einen Platzhalter. Statisch im XML kannst Du keinen Wert für einen Platzhalter übergeben.

* Im Java:

1Resources res = getResources();
2String text = String.format(res.getString(R.string.meintext), "Test");

Bedeutet dies, dass ich in Java den String zusammen setzen muss, den ich gerne hätte und ihn dann direkt in der main.xml, ohne den Umweg über strings.xml zu gehen, einblenden muss? Also den Platzhalter aus strings.xml entfernen und in main.xml einbauen?

— geändert am 04.08.2011, 10:07:09

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

04.08.2011, 11:01:32 via Website

In meinem Beispiel steht in "text" abschließend der formatierte Text. Den setzt Du dann in Deine TextView.

Dazu kannst Du den Platzhalter ruhig in Deiner Ressource Datei lassen - würde ich auch in Hinblick auf zukünftige Übersetzungen so belassen.

Die Zeile 'android:text="@string/meintext"' nimmst Du dann raus.

— geändert am 04.08.2011, 11:04:55

Antworten
Holger K.
  • Forum-Beiträge: 7

04.08.2011, 11:06:27 via Website

Okay, nun habe ich es wie folgt:

1main.xml
2
3<TextView
4android:id="@+id/meintext"
5android:layout_height="wrap_content"
6android:layout_gravity="center"
7android:layout_width="wrap_content">
8</TextView>
9
10MainActivity.java
11
12Resources res = getResources();
13String text = String.format(res.getString(R.string.meintext), "Test");

Fehler in MainActivity.java: Resources cannot be resolved to a type

In der strings.xml habe ich die Zeile auch entfernt, was aber nichts geändert hat.

Antworten
Holger K.
  • Forum-Beiträge: 7

04.08.2011, 11:57:09 via Website

Rafael K.
Drück mal in Eclipse Strg+Shift+O

Das erstellt automatisch die richtigen Importe in der Klasse.

Danke, guter Tipp!

Dabei wurde "import android.widget.TextView;" entfernt und es kam "import android.content.res.Resources;" hinzu.

Vor der Zeile mit dem "Resources res ..." steht jetzt kein Ausrufezeichen mehr aber ein grauer Kreis mit weißem "X" und die Meldung ist dieselbe.

Hinzu kam darunter bei "String text = ..." ein gelbes Warnschild mit dem Hinweis: "The local variable text is never read".

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

04.08.2011, 12:02:34 via Website

Holger K.
Vor der Zeile mit dem "Resources res ..." steht jetzt kein Ausrufezeichen mehr aber ein grauer Kreis mit weißem "X" und die Meldung ist dieselbe.

Hinzu kam darunter bei "String text = ..." ein gelbes Warnschild mit dem Hinweis: "The local variable text is never read".

Zu 1: Hast du die Klasse schon gespeichert? Erst dann wird neu gebuildet und Fehler verschwinden endgültig.
Zu 2: Das heisst die Variable ist überflüssig, weil sie im nachfolgenden Code nicht verwendet wird. So wie die Fehlermeldung sagt :)

Antworten
Holger K.
  • Forum-Beiträge: 7

04.08.2011, 13:12:42 via Website

Zu 1.: Perfekt. Daran lags. Nach einem Build All war die Meldung weg. Danke!

Zu 2.: Ich habe ja lediglich den Code übernommen, der mir hier vorgeschlagen wurde:

1MainActivity.java
2
3 Resources res = getResources();
4 String text = String.format(res.getString(R.string.meintext), "Test");
5
6main.xml
7
8 <TextView
9 android:id="@+id/meintext"
10 android:layout_height="wrap_content"
11 android:layout_gravity="center"
12 android:layout_width="wrap_content">
13 </TextView>

Scheinbar klappt die Verknüpfung zwischen der Java-Codezeile und dem main.xml nicht. Ich hätte halt gedacht, durch "R.string.meintext" und dem "@+id/meintext" würde die zustande kommen und dann "Test" ausgegeben. Das, vermutlich kleine und total einfache, Problem, kostet mich nervlich einige Lebensjahre. :D

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

04.08.2011, 13:21:44 via Website

Guck dir doch mal einige Beispiel an wie man mit GUI Komponenten und auch Resourcen umgeht und schau dort ab.
Lernen durch Nachahmung :)

1id="@+id/bla"

bewirkt, dass du mit findViewById(R.id.bla) darauf zugreifen kannst.

res.getString(R.string.meintext)

liefert nur eine Zeichenkette aus deinen Resourcen, damit du keine Strings im Quellcode definieren musst und vor allem um Mehrsprachigkeit zu unterstützen.

Wenn du dir nun den View holst und per setText() den Text reinschreibst, den du aus den Resourcen holt, hast du den Kreis geschlossen.
Dann ist auch die Variable text benutzt worden und die Warnung verschwindet.

Antworten
Holger K.
  • Forum-Beiträge: 7

04.08.2011, 13:36:05 via Website

Das sind erneut sehr hilfreiche Tipps. Ich versuche das mal. Vielen Dank für eure Geduld und die Hinweise. Ich melde mich, wenn ich es hinbekommen habe (was dauern kann, hihi). ;)

Edit: Ich bin nah dran. Folgendes liefert keinen Fehler mehr. Jedoch auch leider keine Ausgabe. ;-)
1TextView test = (TextView) findViewById(R.id.meintext);
2 test.setText("Hallo Welt!");
3 setContentView(test);

Edit2: Und wieder was dazu gelernt. Obiges läuft sehr wohl. Allerdings muss man die Anwendung bauen und mal im Emulator laufen lassen. Im Graphical Layout der main.xml wird das leider nicht angezeigt, wovon ich ausgegangen war. Das nutze ich nämlich immer um das erstellte kurz zu prüfen weil es immer ein Weilchen dauert, ehe der Emulator geladen ist. ;-)

Danke an alle!

— geändert am 04.08.2011, 17:12:14

Antworten