Name der String-Ressourcen eines Projekts (in Schleife) ermitteln

  • Antworten:7
  • Bentwortet
Frank Rudolf
  • Forum-Beiträge: 215

24.11.2015, 11:28:44 via Website

Ich suche nach einer Möglichkeit, die Namen aller string-Ressourcen des aktuellen Projekts im Code zu ermitteln. Es geht also um den Ressourcen-Namen, den man in einem anderen Zusammenhang über R.id.[RessourcenName] angeben würde.

Sinnvollerweise dürfte man das mit einer Schleife bewerkstelligen. Vielleicht gibt es ja auch so etwas wie eine for-each-Schleife in dem Sinne: gib mir für jede StringRessource in der strings.xml den Namen?

Hintergrund:
Ich möchte aus einer Vielzahl der String-Ressourcen ganz gezielt und dynamisch auf bestimmte zugreifen. Dynamisch, weil sich die gesuchten String-Ressourcen ständig ändern. Dazu muss ich aber alle entsprechenden Ressourcen-Namen durchsuchen.

— geändert am 24.11.2015, 11:32:24

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.11.2015, 17:34:31 via Website

Wieso ständig ändern?
Machst du so viele Updates und änderst da dann die Strings.xml?

Dynamisch mit strings aus den Resourcen ist so eine Sache, würde ich nicht machen.
Ich würde lieber eine DB oder xml/Json File dafür nutzen.
Da bringt Java sogar Methoden zum durchgehen mit, einfach xml/Json in das passende Objekt einlesen und durchgehen. Fertig.

Zumal glaube ich das das so wie du das willst darnicht vorghesehen ist:
http://stackoverflow.com/questions/13447198/how-to-access-values-from-strings-xml-dynamically-in-android

Die strings.xml sind mehr für die App Texte also Button Text etc. weniger für die eigentliche funktion des Textes.

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

24.11.2015, 19:29:41 via Website

Die Strings ändern sich durch häufige Updates und durch unterschiedliche Abfragen. Dies spielt aber für die Lösung des Problems keine Rolle.

Sicher kann man das als Notlösung ansehen. Wenn es gehen würde, wäre mir das aber egal ;)

Solange ich das nicht per SQLite, XML- oder Textdatei hinkriege, probiere ich erst mal diesen Weg.

Das Erstellen zB einer SQLite-Datenbank gelingt mir zwar. Aber es gelingt mir nicht, eine fertige SQLite-Datenbank in das Projekt zu integrieren. Dazu muss man wohl das Gerät rooten, wozu ich noch nicht bereit bin. Mit dem SQLiteBrowser kann ich zB eine fertige Datenbank unter data/data etc. sehen. Ich kann sie aber nicht austauschen (quasi nur Lese- , aber keine Schreibrechte in diesem Tool). Diese Problematik habe ich in diesem Thread besprochen: https://www.nextpit.de/forum/676579/sqlite-datenbank-austauschen-wo-finde-ich-die

— geändert am 24.11.2015, 19:34:50

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.11.2015, 20:05:39 via Website

Danke das hätte ich auch vorgeschlagen ;)

Lese und schreibrecht hat nur deine App (ohne Root)
Das heisst du musst diese DB per Code austauschen und über versionsnummern auf eine neue Version prüfen und dann die interne DB Updaten.
Oder du baust dir einen Aktualisieren Button.
Das ganze würde natürlich auch funktionieren, wenn die DB nicht in den Assets sondern im USB Speicher ist.
Das könntest du dann zum Test benutzen, damit hättest du es einfnacher die DB auszutauschen, sonst musst du imer die in den Assets Updaten.

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

25.11.2015, 12:12:57 via Website

OK, soeben ist mir der Durchbruch gelungen. Ich bedanke mich erst mal bei allen.

Sicherlich versuche ich auch noch mal die Varianten mit SQLite und XML-Datei etc.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.11.2015, 13:32:35 via App

Vielleicht willst du noch verraten wie du das jetzt gemacht hast ;)

— geändert am 25.11.2015, 13:33:15

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

02.12.2015, 11:59:54 via Website

for (Field field : R.string.class.getDeclaredFields())
{
int id = getResources().getIdentifier(field.getName(), "string", getPackageName());
String value = (String) getResources().getText(id);
}

Diese Zeilen oben scheinen zu genügen. Allerdings bin ich noch immer am mühsamen Integrieren dieser Lösung in das Gesamtprojekt. Bin halt Anfänger ;-).

Antworten