getString вне контекста или действия
я нашел R.string
довольно удивительным для хранения жестко закодированных строк из моего кода, и я хотел бы продолжать использовать его в служебном классе, который работает с моделями в моем приложении для создания вывода. Например, в этом случае я генерирую электронное письмо из модели за пределами действия.
можно использовать getString
за пределами Context
или Activity
? Полагаю, я мог бы пройти в текущей деятельности, но это кажется ненужным. Пожалуйста, поправьте меня, если я неправильно!
Edit: можем ли мы получить доступ к ресурсам без используя Context
?
9 ответов:
Да, мы можем получить доступ к ресурсам без использования 'Context'
вы можете использовать:
Resources.getSystem().getString(android.R.string.somecommonstuff)
... везде в вашем приложении, даже в объявлениях статических констант. К сожалению, он поддерживает только системные ресурсы.
для использования местных ресурсов данное решение. Это не тривиально, но это работает.
к сожалению, единственный способ получить доступ к любому из строковых ресурсов-это
Context
(т. е.Activity
илиService
). То, что я обычно делал в этом случае, - это просто требовать, чтобы вызывающий передал в контексте.
на
MyApplication
, которая расширяетApplication
:public static Resources resources;
на
MyApplication
' sonCreate
:resources = getResources();
теперь вы можете использовать это поле в любом месте вашего приложения.
кстати, одна из причин символ не найден ошибка может заключаться в том, что ваша IDE импортировала android.R; класс вместо вашего одного. Просто изменить импорт android.R; до импорт.пространство имен.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); }
Если у вас есть класс, который вы используете в действии, и вы хотите иметь доступ к ресурсу в этом классе, я рекомендую вам определить контекст как закрытую переменную в классе и инициализировать его в конструкторе:
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);
это должно получить доступ к
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; } }
инициализировать синглтон в своем
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); } }
если я не ошибаюсь, это дает вам крючок к applicationContext везде, вызовите его с
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" >
пожалуйста, дайте мне знать, если вы видите что-то не так здесь, Спасибо. :)
Лучший Подход
как @Гангнус ответил, но это решение только для ресурсов по умолчанию в Android.
я использую
App.getRes().getString(R.string.some_id)
, что будет работать везде в приложении.что? Он очень прост в использовании в любом месте вашего приложения!
так вот уникальное решение С помощью которого вы можете получить доступ к ресурсам из любого места, как
Util class
.(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)
в любом месте в приложение.
вот что я сделал, В MainActivity создайте статическую переменную для контекста, как показано ниже:
public static Context mContext;
и в onCreate() инициализировать mContext к этому;
mContext = this;
затем, в файле, где вы хотите получить доступ к контексту, скажем,
private Context context = MainActivity.mContext;
теперь вы можете получить строковый ресурс следующим образом:
String myString = context.getResources().getString(R.string.resource_id);