Ich versuche, die Methode getResources in einer Klasse ohne Aktivität zu verwenden. Wie erhalte ich den Verweis auf das Objekt "resources", damit ich auf die im Ressourcenordner gespeicherte XML-Datei zugreifen kann?
Beispiel:
XmlPullParser xpp = getResources().getXml(R.xml.samplexml);
Context
Objekte in Android weiterzugeben . Dies kann zu Speicherlecks führen. Siehe meine Antwort für eine weniger riskante Lösung.Antworten:
Sie müssen ein
context
Objekt daran übergeben. Entwederthis
wenn Sie einen Verweis auf die Klasse in einer Aktivität haben, odergetApplicationContext()
Dann können Sie es im Konstruktor verwenden (oder auf eine Instanzvariable setzen):
Wobei der Konstruktor
Context
als Parameter akzeptiertquelle
Context
Objekte in Android weiterzugeben . Dies kann zu Speicherlecks führen.Context
Objekte sind böse, weil es nicht sofort offensichtlich ist, ob sie anwendungs- oder aktivitätsweit sind. Speicherlecks (und Abstürze) treten auf, wenn Sie die falsche angeben. Zum Beispiel kann eine ZuführungActivity
zu einem statischen Objekt , das eine mussContext
Objekt und der nicht zerstört wird, wenn dasActivity
ist , führt zu demActivity
nach onDestroy persistierenden, da es nicht GCed aufgrund dieses anderen statischen Objekts sein kann. Ja, es kann gefährlich sein, aber es ist wichtig zu wissen, warum es gefährlich ist.Es ist keine gute Idee,
Context
Gegenstände herumzugeben. Dies führt häufig zu Speicherlecks. Mein Vorschlag ist, dass Sie es nicht tun. Ich habe zahlreiche Android-Apps erstellt, ohne den Kontext an Nicht-Aktivitätsklassen in der App übergeben zu müssen. Eine bessere Idee wäre, die Ressourcen zu erhalten, auf die Sie zugreifen müssen, während Sie imActivity
oder sindFragment
, und sie in einer anderen Klasse zu behalten. Sie können diese Klasse dann in allen anderen Klassen in Ihrer App verwenden, um auf die Ressourcen zuzugreifen, ohneContext
Objekte weitergeben zu müssen.quelle
Es gibt noch einen Weg, ohne auch ein Objekt zu erstellen. Überprüfen Sie die Referenz . Danke für @cristian. Unten füge ich die Schritte hinzu, die in der obigen Referenz erwähnt wurden. Für mich mag ich es nicht, ein Objekt dafür zu erstellen und darauf zuzugreifen. Also habe ich versucht, auf das zuzugreifen,
getResources()
ohne ein Objekt zu erstellen. Ich habe diesen Beitrag gefunden. Also dachte ich, es als Antwort hinzuzufügen.Befolgen Sie die Schritte, um
getResources()
in einer Nicht-Aktivitätsklassewithout passing a context
über das Objekt zuzugreifen .Application
, zum Beispielpublic class App extends Application {
. Lesen Sie den Code neben den Schritten.android:name
Attribut Ihres<application>
Tags inAndroidManifest.xml
, um auf Ihre neue Klasse zu verweisen, zandroid:name=".App"
onCreate()
Speichern Sie in der Methode Ihrer App-Instanz Ihren Kontext (z. B.this
) in einem statischen Feld mit dem Namenapp
und erstellen Sie eine statische Methode, die dieses Feld zurückgibt, zgetContext()
.App.getContext()
wann immer Sie einen Kontext erhalten möchten, und dann können wir verwendenApp.getContext().getResources()
, um Werte aus den Ressourcen abzurufen.So sollte es aussehen:
quelle
Hier ist meine Antwort:
}}
und der Anruf kann so sein:
quelle
Dies kann mit erfolgen
quelle
Context
Objekte ist nicht eine gesunde PraxisWir können den Kontext so verwenden. Versuchen Sie es jetzt. Wo das übergeordnete Element die ViewGroup ist.
quelle
Nun, es ist nicht nötig, den Kontext weiterzugeben und all das zu tun ... tun Sie dies einfach
Bearbeiten: wobei übergeordnet die ViewGroup ist
quelle
Das funktioniert bei mir immer:
Nicht im Zusammenhang mit dieser Frage, aber Beispiel für die Verwendung eines Fragments für den Zugriff auf Systemressourcen / -aktivitäten wie folgt:
quelle
In der Reiseleiter-App von Udacitys Basic ANdroid-Kurs habe ich das Konzept der Fragmente verwendet. Ich blieb eine Weile stecken und hatte Schwierigkeiten, auf einige String-Ressourcen zuzugreifen, die in Strings, XML-Datei, beschrieben sind. Endlich eine Lösung.
Dies ist die Hauptaktivitätsklasse
Paket com.example.android.tourguidekolkata;
Dies ist die Nicht-Aktivitätsklasse, die FragmentPageAdapter erweitert
quelle
In einer einfachen Klasse deklarieren Sie den Kontext und rufen Daten aus der Datei aus dem Ordner res ab
In der Aktivitätsklasse deklarieren Sie dies so
quelle
Ich bin spät dran, aber vollständige Lösung;: Beispielklasse, Verwenden Sie den Kontext wie folgt: -
Warnung (Speicherlecks)
Wie kann man das lösen?
Option 1 : Anstatt den Aktivitätskontext, dh diesen, an die Singleton-Klasse zu übergeben, können Sie applicationContext () übergeben.
Option 2: Wenn Sie den Aktivitätskontext wirklich verwenden müssen, stellen Sie bei Zerstörung der Aktivität sicher, dass der Kontext, den Sie an die Singleton-Klasse übergeben haben, auf null gesetzt ist.
Hoffe es hilft..∆∆∆∆
quelle
in Ihrer Hauptaktivität:
ResourcesHelper:
dann benutze es überall
quelle