Ich fand das R.string
ziemlich großartig, um fest codierte Zeichenfolgen aus meinem Code herauszuhalten, und ich möchte es weiterhin in einer Utility-Klasse verwenden, die mit Modellen in meiner Anwendung zusammenarbeitet, um eine Ausgabe zu generieren. In diesem Fall generiere ich beispielsweise eine E-Mail von einem Modell außerhalb der Aktivität.
Ist es möglich, getString
außerhalb eines Context
oder zu verwendenActivity
? Ich nehme an, ich könnte die aktuelle Aktivität bestehen, aber es scheint unnötig. Bitte korrigiere mich wenn ich falsch liege!
Bearbeiten: Können wir auf die Ressourcen zugreifen, ohne sie zu verwenden Context
?
java
android
string
android-resources
android-context
SapphireSun
quelle
quelle
Antworten:
Ja, wir können auf Ressourcen zugreifen, ohne "Kontext" zu verwenden
Sie können verwenden:
... überall in Ihrer Anwendung, auch in statischen Konstantendeklarationen. Leider werden nur die Systemressourcen unterstützt .
Verwenden Sie für lokale Ressourcen diese Lösung . Es ist nicht trivial, aber es funktioniert.
quelle
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
Leider können Sie nur mit einem
Context
(dh einemActivity
oderService
) auf eine der Zeichenfolgenressourcen zugreifen . Was ich in diesem Fall normalerweise getan habe, ist einfach zu verlangen, dass der Anrufer den Kontext weitergibt.quelle
ctx.getString(ctx.R.string.blah);
Context
damit Sie es entweder von einer Aktivität oder einem Dienst verwenden können.ctx.R.string.blah
, verwenden Sie einfachR.string.blah
symbol not found error
kommt, aber stellen Sie sicher, dass Sie überR
der Klasse importiert haben .In
MyApplication
, das sich erstrecktApplication
:In
MyApplication
'sonCreate
:Jetzt können Sie dieses Feld von überall in Ihrer Anwendung verwenden.
quelle
Übrigens, einer der Gründe für den Fehler " Symbol nicht gefunden" kann sein, dass Ihre IDE android.R importiert hat. Klasse statt deiner. Ändern Sie einfach den Import android.R; um your.namespace.R zu importieren;
Also 2 grundlegende Dinge, um String in der verschiedenen Klasse sichtbar zu machen:
quelle
Einzigartiger Ansatz
App.getRes().getString(R.string.some_id)
(1) Erstellen oder bearbeiten Sie Ihre
Application
Klasse (falls bereits vorhanden) .(2) Fügen Sie Ihrem
manifest.xml
<application
Tag ein Namensfeld hinzu.Jetzt können Sie loslegen. Verwenden Sie
App.getRes().getString(R.string.some_id)
überall in der App.quelle
Wenn Sie eine Klasse haben, die Sie in einer Aktivität verwenden, und auf die Ressource in dieser Klasse zugreifen möchten, empfehle ich Ihnen, einen Kontext als private Variable in der Klasse zu definieren und im Konstruktor zu initialisieren:
Machen Sie einen Moment des Unterrichts in Ihrer Aktivität:
quelle
Auf diese Weise können Sie
applicationContext
von überall darauf zugreifen, sodass SieapplicationContext
überall darauf zugreifen können, wo Sie es verwenden können.Toast
,getString()
,sharedPreferences
Etc.Der Singleton:
Initialisieren Sie den Singleton in Ihrer
Application
Unterklasse:Wenn ich mich nicht irre, gibt Ihnen dies überall einen Haken an applicationContext. Rufen Sie ihn mit auf.
ApplicationContextSingleton.getInstance.getApplicationContext();
Sie sollten dies zu keinem Zeitpunkt löschen müssen, da dies beim Schließen der Anwendung sowieso dazu gehört.Denken Sie daran, ein Update durchzuführen
AndroidManifest.xml
, um dieseApplication
Unterklasse zu verwenden:Bitte lassen Sie mich wissen, wenn Sie hier etwas falsch sehen, danke. :) :)
quelle
Der beste Ansatz aus der Antwort von Khemraj:
App-Klasse
Erklärung im Manifest
Konstanten Klasse
Verwenden von
quelle
Es ist besser, so etwas ohne Kontext und Aktivität zu verwenden :
quelle
Irgendwie gefielen die hackigen Lösungen zum Speichern statischer Werte nicht, so dass etwas länger, aber eine saubere Version, die auch getestet werden kann.
Es wurden 2 Möglichkeiten gefunden, dies zu tun.
z.B
Bevor Sie lesen: Diese Version verwendet
Data binding
XML-
Aktivität / Fragment-
Manchmal müssen Sie den Text basierend auf einem Feld in einem Modell ändern. Sie würden also auch dieses Modell datenbinden, und da Ihre Aktivität / Ihr Fragment das Modell kennt, können Sie den Wert sehr gut abrufen und dann die Zeichenfolge basierend darauf datenbinden.
quelle
Sie können dies in Kotlin tun, indem Sie eine Klasse erstellen, die Application erweitert, und dann ihren Kontext verwenden, um die Ressourcen an einer beliebigen Stelle in Ihrem Code aufzurufen
Ihre App-Klasse wird so aussehen
Deklarieren Sie Ihre Anwendungsklasse in AndroidManifest.xml (sehr wichtig)
Verwenden Sie den folgenden Code, um beispielsweise auf eine Zeichenfolgendatei zuzugreifen
quelle
Folgendes habe ich getan: Erstellen Sie in Ihrer MainActivity eine statische Variable für den Kontext, wie unten gezeigt:
und in onCreate () initialisiere mContext dazu;
In der Datei, in der Sie auf den Kontext zugreifen möchten, sagen Sie beispielsweise:
Jetzt können Sie eine Zeichenfolgenressource auf folgende Weise abrufen:
quelle
Ich habe es benutzt
getContext().getApplicationContext().getString(R.string.nameOfString);
Es funktioniert für mich.quelle
getContext()
ist überall verfügbar?!