wake-up-neo.com

getString Außerhalb eines Kontexts oder einer Aktivität

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 Activityverwendet 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?

208
SapphireSun

Ja, wir können auf Ressourcen zugreifen, ohne `Context 'zu verwenden

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.

354
Gangnus

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.

106
Erich Douglass

In MyApplication, das Application erweitert:

public static Resources resources;

In MyApplications onCreate:

resources = getResources();

Jetzt können Sie dieses Feld von überall in Ihrer Anwendung verwenden.

28
konmik

Ü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);
}
21

Einzigartiger Ansatz

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.

13
Khemraj

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);
3
Malus Jan

Es ist besser, so etwas ohne Kontext und Aktivität zu verwenden:

Resources.getSystem().getString(R.string.my_text)
0
reza_khalafi

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. :)

0
Versa

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
0