GetString вне контекста или действия
Я обнаружил, что R.string
довольно классный для хранения жестко заданных строк из моего кода, и я хотел бы продолжать использовать его в классе утилиты, который работает с моделями в моем приложении для генерации вывода. Например, в этом случае я генерирую электронное письмо от модели за пределами действия.
Можно ли использовать getString
вне a Context
или Activity
? Я полагаю, что могу перейти в текущую деятельность, но это кажется ненужным. Пожалуйста, поправьте меня, если я ошибаюсь!
Изменить: можем ли мы получить доступ к ресурсам без использования Context
?
Ответы
Ответ 1
Да, мы можем получить доступ к ресурсам без использования `Context`
Вы можете использовать:
Resources.getSystem().getString(android.R.string.somecommonstuff)
... всюду в вашем приложении, даже в объявлениях статических констант.
К сожалению, он поддерживает только системные ресурсы.
Для локальных ресурсов используйте это решение. Это не тривиально, но оно работает.
Ответ 2
К сожалению, единственный способ доступа к любому из строковых ресурсов - это Context
(т.е. Activity
или Service
). То, что я обычно делал в этом случае, это просто потребовать, чтобы вызывающий вызывал в контексте.
Ответ 3
В MyApplication
, который продолжается Application
:
public static Resources resources;
В MyApplication
onCreate
:
resources = getResources();
Теперь вы можете использовать это поле из любого места в своем приложении.
Ответ 4
Кстати, одной из причин ошибки не найденной может быть то, что ваша IDE импортировала android.R; класс вместо вашего. Просто измените import android.R; на импортировать your.namespace.R;
Итак, две основные вещи, чтобы получить строку, видимую в другом классе:
//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);
}
Ответ 5
Уникальный подход
App.getRes().getString(R.string.some_id)
Это будет работать везде в приложении. (Класс Util, диалог, фрагмент или любой класс в вашем приложении)
(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
.
<application
android:name=".App"
...
>
...
</application>
Теперь тебе пора. Используйте App.getRes().getString(R.string.some_id)
любом месте приложения.
Ответ 6
Если у вас есть класс, который вы используете в действии, и хотите получить доступ к ressource в этом классе, я рекомендую вам определить контекст как приватную переменную в классе и инициализировать его в конструкторе:
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);
Ответ 7
Лучший подход из ответа Хемрая:
Класс приложения
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
Ответ 8
Это позволит вам получить доступ к 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);
}
}
Если я не ошибаюсь, это дает вам доступ к 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"
>
Пожалуйста, дайте мне знать, если вы видите что-то не так, спасибо.:)
Ответ 9
Лучше использовать что-то подобное без контекста и активности:
Resources.getSystem().getString(R.string.my_text)
Ответ 10
Здесь, что я сделал, в вашей MainActivity создайте статическую переменную для контекста, как показано ниже:
public static Context mContext;
и в onCreate() инициализировать mContext;
mContext = this;
Затем в файле, где вы хотите получить доступ к контексту, скажем,
private Context context = MainActivity.mContext;
Теперь вы можете получить строковый ресурс следующим образом,
String myString = context.getResources().getString(R.string.resource_id);
Ответ 11
Я использовал
getContext().getApplicationContext().getString(R.string.nameOfString);
Это работает для меня.