Ich möchte Zeichenfolgen aus einer xml
Datei lesen, bevor ich etwas anderes wie setText
Widgets mache. Wie kann ich das tun, ohne dass ein Aktivitätsobjekt aufgerufen werden muss getResources()
?
168
Application
zum Beispielpublic class App extends Application {
android:name
Attribut Ihres <application>
Tags in AndroidManifest.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 Namen mContext
und erstellen Sie eine statische Methode, die dieses Feld zurückgibt, z getContext()
.So sollte es aussehen:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Jetzt können Sie verwenden: App.getContext()
wann immer Sie einen Kontext erhalten möchten, und dann getResources()
(oder App.getContext().getResources()
).
Nur für Systemressourcen!
Verwenden
Sie können sie überall in Ihrer Anwendung verwenden, auch in Deklarationen für statische Konstanten!
quelle
Toast
z. B. eineSharedPreference
Instanz erstellen, eine Instanz abrufen, eine Datenbank öffnen, wie mein Lateinlehrer sagt: usw. ).Meine Kotlin-Lösung besteht darin, einen statischen Anwendungskontext zu verwenden:
Und die Strings-Klasse, die ich überall benutze:
So können Sie Ressourcen auf saubere Weise abrufen
Bitte löschen Sie diese Antwort nicht, lassen Sie mich eine behalten.
quelle
Strings
war sie hilfreich.Es gibt auch eine andere Möglichkeit. Ich lade OpenGl-Shader aus folgenden Ressourcen:
Wie Sie sehen, können Sie auf jede Ressource im Pfad
/res/...
ÄndernaClass
zu Ihrer Klasse zugreifen . So lade ich auch Ressourcen in Tests (androidTests)quelle
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:Jetzt sollten Sie ApplicationContextSingleton.getInstance (). GetApplicationContext (). GetResources () von überall aus verwenden können, auch von den wenigen Stellen, an denen Anwendungsunterklassen dies nicht können.
Bitte lassen Sie mich wissen, wenn Sie hier etwas falsch sehen, danke. :) :)
quelle
Eine andere Lösung:
Wenn Sie eine statische Unterklasse in einer nicht statischen äußeren Klasse haben, können Sie über statische Variablen in der äußeren Klasse, die Sie beim Erstellen der äußeren Klasse initialisieren, von innerhalb der Unterklasse auf die Ressourcen zugreifen. Mögen
Ich habe es für die Funktion getPageTitle (int position) des statischen FragmentPagerAdapter in meiner FragmentActivity verwendet, die aufgrund von I8N nützlich ist.
quelle
Abkürzung
Ich benutze
App.getRes()
stattApp.getContext().getResources()
(wie @Cristian antwortete)Es ist sehr einfach, überall in Ihrem Code zu verwenden!
Hier ist eine einzigartige Lösung, mit der Sie von überall auf Ressourcen zugreifen können
Util class
.(1) Erstellen oder bearbeiten Sie Ihre
Application
Klasse.(2) Fügen Sie Ihrem
manifest.xml
<application
Tag ein Namensfeld hinzu. (oder überspringen Sie dies, wenn bereits vorhanden)Jetzt können Sie loslegen.
Verwenden Sie
App.getRes().getString(R.string.some_id)
überall im Code.quelle
Ich denke, mehr Weg ist möglich. Aber manchmal benutze ich diese Lösung. (vollständig global):
quelle
Ich lade den Shader für openGL ES aus der statischen Funktion.
Denken Sie daran, dass Sie für Ihren Datei- und Verzeichnisnamen Kleinbuchstaben verwenden müssen, da sonst der Vorgang fehlschlägt
quelle
quelle
Ich verwende API Level 27 und habe die beste Lösung gefunden, nachdem ich ungefähr zwei Tage lang Probleme hatte. Wenn Sie eine XML-Datei aus einer Klasse lesen möchten, die nicht von Aktivität oder Anwendung abgeleitet ist, gehen Sie wie folgt vor.
Legen Sie die Datei testdata.xml im Assets-Verzeichnis ab.
Schreiben Sie den folgenden Code, um das Testdatendokument zu analysieren.
quelle
In Ihrer Klasse, in der Sie die statische Funktion implementieren , können Sie eine private \ public- Methode aus dieser Klasse aufrufen . Die private \ public-Methode kann auf die getResources zugreifen .
beispielsweise:
und von einer anderen Klasse \ Aktivität aus können Sie Folgendes aufrufen:
quelle
Wenn Sie einen Kontext haben, meine ich innen;
Mit diesem Code können Sie Ressourcen abrufen:
quelle