Ich fand das R.string
ziemlich toll, um hartcodierte Zeichenfolgen aus meinem Code zu entfernen, und ich möchte es gerne in einer Dienstprogrammklasse verwenden, die mit Modellen in meiner Anwendung arbeitet, um Ausgaben zu generieren. In diesem Fall generiere ich zum Beispiel eine E-Mail von einem Modell außerhalb der Aktivität.
Kann getString
außerhalb einer Context
oder Activity
verwendet werden? Ich vermute, ich könnte die aktuelle Aktivität bestehen, aber es scheint unnötig. Bitte korrigiere mich wenn ich falsch liege!
Bearbeiten: Können wir mit Context
auf die Ressourcen ohne zugreifen?
Sie können verwenden:
Resources.getSystem().getString(Android.R.string.somecommonstuff)
... überall in Ihrer Anwendung, selbst in Deklarationen mit statischen Konstanten . Leider werden nur die Systemressourcen unterstützt.
Für lokale Ressourcen verwenden Sie diese Lösung . Es ist nicht trivial, aber es funktioniert.
Leider können Sie nur auf eine der String-Ressourcen zugreifen, indem Sie eine Context
(d. H. Eine Activity
oder Service
) verwenden. Was ich normalerweise in diesem Fall getan habe, ist einfach den Aufruf des Anrufers im Kontext zu fordern.
In MyApplication
, das Application
erweitert:
public static Resources resources;
In MyApplication
s onCreate
:
resources = getResources();
Jetzt können Sie dieses Feld von überall in Ihrer Anwendung verwenden.
Übrigens, einer der Gründe für das Symbol wurde nicht gefunden Fehler kann sein, dass Ihr IDE Android.R importiert hat; Klasse statt deiner. Ändern Sie einfach importieren Sie Android.R; to importiere deinen.namespace.R;
Also zwei grundlegende Dinge, um String in der verschiedenen Klasse sichtbar zu machen:
//make sure you are importing the right R class
import your.namespace.R;
//don't forget about the context
public void some_method(Context context) {
context.getString(R.string.YOUR_STRING);
}
App.getRes().getString(R.string.some_id)
Dies funktioniert überall in der App. (til-Klasse, Dialog, Fragment oder eine beliebige Klasse in Ihrer App)
(1) Erstellen oder bearbeiten Sie (falls bereits vorhanden) Ihre Klasse Application
.
import Android.app.Application;
import Android.content.res.Resources;
public class App extends Application {
private static App mInstance;
private static Resources res;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
res = getResources();
}
public static App getInstance() {
return mInstance;
}
public static Resources getResourses() {
return res;
}
}
(2) Fügen Sie Ihrem Tag manifest.xml
<application
Ein Namensfeld hinzu.
<application
Android:name=".App"
...
>
...
</application>
Jetzt können Sie loslegen. Verwenden Sie App.getRes().getString(R.string.some_id)
überall in der App.
Wenn Sie über eine Klasse verfügen, die Sie in einer Aktivität verwenden, und Sie auf die Ressource in dieser Klasse zugreifen möchten, empfehle ich Ihnen, einen Kontext als private Variable in class zu definieren und ihn im Konstruktor zu initialisieren:
public class MyClass (){
private Context context;
public MyClass(Context context){
this.context=context;
}
public testResource(){
String s=context.getString(R.string.testString).toString();
}
}
Machen Sie einen Unterricht in Ihrer Aktivität:
MyClass m=new MyClass(this);
Es ist besser, so etwas ohne Kontext und Aktivität zu verwenden:
Resources.getSystem().getString(R.string.my_text)
Dadurch sollten Sie von überall auf applicationContext
zugreifen können, sodass Sie applicationContext
überall dort abrufen können, wo Sie es verwenden können. Toast
, getString()
, sharedPreferences
usw.
The Singleton:
package com.domain.packagename;
import Android.content.Context;
/**
* Created by Versa on 10.09.15.
*/
public class ApplicationContextSingleton {
private static PrefsContextSingleton mInstance;
private Context context;
public static ApplicationContextSingleton getInstance() {
if (mInstance == null) mInstance = getSync();
return mInstance;
}
private static synchronized ApplicationContextSingleton getSync() {
if (mInstance == null) mInstance = new PrefsContextSingleton();
return mInstance;
}
public void initialize(Context context) {
this.context = context;
}
public Context getApplicationContext() {
return context;
}
}
Initialisieren Sie das Singleton in Ihrer Application
-Unterklasse:
package com.domain.packagename;
import Android.app.Application;
/**
* Created by Versa on 25.08.15.
*/
public class mApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ApplicationContextSingleton.getInstance().initialize(this);
}
}
Wenn ich mich nicht irre, haben Sie überall einen Link zu applicationContext. Rufen Sie es mit ApplicationContextSingleton.getInstance.getApplicationContext();
.__ auf. Sie sollten dies an keiner Stelle löschen, da beim Schließen der Anwendung dies ohnehin damit zusammenhängt.
Denken Sie daran, AndroidManifest.xml
zu aktualisieren, um diese Application
-Unterklasse zu verwenden:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.domain.packagename"
>
<application
Android:allowBackup="true"
Android:name=".mApplication" <!-- This is the important line -->
Android:label="@string/app_name"
Android:theme="@style/AppTheme"
Android:icon="@drawable/app_icon"
>
Bitte lassen Sie mich wissen, wenn Sie hier etwas Falsches sehen, danke. :)
Der beste Ansatz aus der Antwort von Khemraj:
App-Klasse
class App : Application() {
companion object {
lateinit var instance: Application
lateinit var resourses: Resources
}
// MARK: - Lifecycle
override fun onCreate() {
super.onCreate()
instance = this
resourses = resources
}
}
Erklärung im Manifest
<application
Android:name=".App"
...>
</application>
Konstanten Klasse
class Localizations {
companion object {
val info = App.resourses.getString(R.string.info)
}
}
Verwenden von
textView.text = Localizations.info