getString вне контекста или действия - PullRequest
226 голосов
/ 23 ноября 2010

Я нашел R.string довольно удивительным для того, чтобы не задавать жестко закодированные строки в моем коде, и я хотел бы продолжать использовать его в служебном классе, который работает с моделями в моем приложении для генерации вывода.Например, в этом случае я генерирую электронное письмо из модели вне действия.

Можно ли использовать getString вне Context или Activity?Полагаю, я мог бы перейти к текущей деятельности, но это кажется ненужным.Пожалуйста, поправьте меня, если я ошибаюсь!

Редактировать: Можем ли мы получить доступ к ресурсам без , используя Context?

Ответы [ 11 ]

380 голосов
/ 07 января 2012

Да, мы можем получить доступ к ресурсам, не используя `Context`

Вы можете использовать:

Resources.getSystem().getString(android.R.string.somecommonstuff)

... везде в вашем приложении, даже в объявлениях статических констант.К сожалению, он поддерживает только системные ресурсы .

Для локальных ресурсов используйте это решение .Это не тривиально, но работает.

106 голосов
/ 23 ноября 2010

К сожалению, единственный способ получить доступ к любому из строковых ресурсов - это Context (т.е. Activity или Service). Что я обычно делал в этом случае, так это просто требовал, чтобы вызывающая сторона передавала контекст.

31 голосов
/ 10 марта 2015

В MyApplication, что расширяет Application:

public static Resources resources;

В MyApplication onCreate:

resources = getResources();

Теперь вы можете использовать это поле в любом месте вашего приложения.

21 голосов
/ 24 мая 2012

Кстати, одна из причин, по которой символ не найден * Ошибка 1002 *, может заключаться в том, что ваша IDE импортировала android.R;класс вместо твоего.Просто измените import android.R; на import your.namespace.R;

Итак, 2 основных вещи, чтобы строка была видна в другом классе:

//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);
}
11 голосов
/ 11 июля 2018

Уникальный подход

App.getRes().getString(R.string.some_id)

Это будет работать везде в приложении. ( Util class, Dialog, Fragment или любой класс в вашем приложении )

(1) Создайте или отредактируйте (если уже существует) свой класс 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) Добавьте поле имени в тег manifest.xml <application.

<application
        android:name=".App"
        ...
        >
        ...
    </application>

Теперь тебе пора. Используйте App.getRes().getString(R.string.some_id) в любом месте приложения.

4 голосов
/ 13 марта 2016

Если у вас есть класс, который вы используете в деятельности, и вы хотите иметь доступ к ресурсам в этом классе, я рекомендую вам определить контекст как частную переменную в классе и инициализировать его в конструкторе:

public class MyClass (){
    private Context context;

    public MyClass(Context context){
       this.context=context;
    }

    public testResource(){
       String s=context.getString(R.string.testString).toString();
    }
}

Создание мгновенного занятия в вашей деятельности:

MyClass m=new MyClass(this);
1 голос
/ 14 февраля 2019

Лучший подход из ответа Хемрая:

Класс приложения

class App : Application() {

    companion object {
        lateinit var instance: Application
        lateinit var resourses: Resources
    }


    // MARK: - Lifecycle

    override fun onCreate() {
        super.onCreate()
        instance = this
        resourses = resources
    }

}

Декларация в манифесте

<application
        android:name=".App"
        ...>
</application>     

Класс констант

class Localizations {

    companion object {
        val info = App.resourses.getString(R.string.info)
    }

}

Использование

textView.text = Localizations.info
0 голосов
/ 15 июня 2019

Лучше использовать что-то подобное без контекста и активности :

Resources.getSystem().getString(R.string.my_text)
0 голосов
/ 26 августа 2018

Вот что я сделал, В вашей MainActivity создайте статическую переменную для контекста, как показано ниже:

public static Context mContext;

и в onCreate () инициализируйте mContext для этого;

mContext = this;

Затем в файле, где вы хотите получить доступ к контексту, скажем,

private Context context = MainActivity.mContext;

Теперь вы можете получить строковый ресурс следующим образом:

String myString = context.getResources().getString(R.string.resource_id);
0 голосов
/ 25 сентября 2015

Это должно дать вам доступ к applicationContext из любого места, что позволит вам получить applicationContext в любом месте, где его можно использовать; Toast, getString(), sharedPreferences и т. Д.

Синглтон:

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;
    }

}

Инициализация Singleton в вашем подклассе Application:

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

Если я не ошибаюсь, это дает вам повод для приложенияContext везде, вызывайте его с помощью ApplicationContextSingleton.getInstance.getApplicationContext(); Вам не нужно очищать это в любой момент, так как когда приложение закрывается, это в любом случае идет с этим.

Не забудьте обновить AndroidManifest.xml, чтобы использовать этот Application подкласс:

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

Пожалуйста, дайте мне знать, если вы видите здесь что-то не так, спасибо. :)

...