Я хочу прочитать строки из файла xml
, прежде чем я сделаю что-нибудь еще, как setText
на виджетах, так как я могу сделать это без объекта активности, чтобы позвонить getResources()
?Как получить содержимое ресурса из статического контекста?
ответ
- Создайте подкласс
Application
, напримерpublic class App extends Application {
- Установите атрибут вашего
<application>
тега вAndroidManifest.xml
android:name
, чтобы указать на новый класс, например,android:name=".App"
- Метод
onCreate()
вашего приложения, сохраните свой контекст (например,this
) в статическом поле с именемmContext
и создайте статический метод, который возвращает это поле, например.getContext()
:
Вот как это должно выглядеть:
public class App extends Application{
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static Context getContext(){
return mContext;
}
}
Теперь вы можете использовать: App.getContext()
всякий раз, когда вы хотите, чтобы получить контекст, а затем getResources()
(или App.getContext().getResources()
).
Использование
Resources.getSystem().getString(android.R.string.cancel)
Вы можете использовать их везде в вашем приложении, даже в статических деклараций констант! Но только для системных ресурсов!
думаю, больше дорога возможен. Но иногда я использую это решение. (Полный глобальный):
import android.content.Context;
import <your package>.R;
public class XmlVar {
private XmlVar() {
}
private static String _write_success;
public static String write_success() {
return _write_success;
}
public static void Init(Context c) {
_write_success = c.getResources().getString(R.string.write_success);
}
}
//After activity created:
cont = this.getApplicationContext();
XmlVar.Init(cont);
//And use everywhere
XmlVar.write_success();
В классе, где вы реализуете статической функции, вы можете вызвать частный \ общественного метода из этого класса. Частный \ открытый метод может получить доступ к getResources.
, например:
public class Text {
public static void setColor(EditText et) {
et.resetColor(); // it works
// ERROR
et.setTextColor(getResources().getColor(R.color.Black)); // ERROR
}
// set the color to be black when reset
private void resetColor() {
setTextColor(getResources().getColor(R.color.Black));
}
}
и из другого класса \ активности, вы можете позвонить:
Text.setColor('some EditText you initialized');
, если у вас есть контекст, я имею в виду внутри;
public void onReceive(Context context, Intent intent){
}
вы можете использовать этот код, чтобы получить ресурсы:
context.getResources().getString(R.string.app_name);
одноэлементных:
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"
>
Теперь вы должны быть в состоянии использовать ApplicationContextSingleton.getInstance() getApplicationContext() GetResources() из любой точки мира, также очень мало мест, где. подклассы приложений can't.
Пожалуйста, дайте мне знать, если вы видите что-то не так, спасибо. :)
Другим решение:
Если у вас есть статический подкласс в нестатическом внешнем классе, вы можете получить доступ к ресурсам внутри подкласса с помощью статических переменных внешнего класса, который инициализирует по созданию внешний класс. Как
public class Outerclass {
static String resource1
public onCreate() {
resource1 = getString(R.string.text);
}
public static class Innerclass {
public StringGetter (int num) {
return resource1;
}
}
}
Я использовал его для (INT позиция) Функция getPageTitle статического FragmentPagerAdapter в моей FragmentActivity, который полезен из-за I8N.
Существует также другая возможность. Я загружаю OPENGL шейдеров из ресурсов, как это:
static private String vertexShaderCode;
static private String fragmentShaderCode;
static {
vertexShaderCode = readResourceAsString("/res/raw/vertex_shader.glsl");
fragmentShaderCode = readResourceAsString("/res/raw/fragment_shader.glsl");
}
private static String readResourceAsString(String path) {
Exception innerException;
Class<? extends FloorPlanRenderer> aClass = FloorPlanRenderer.class;
InputStream inputStream = aClass.getResourceAsStream(path);
byte[] bytes;
try {
bytes = new byte[inputStream.available()];
inputStream.read(bytes);
return new String(bytes);
} catch (IOException e) {
e.printStackTrace();
innerException = e;
}
throw new RuntimeException("Cannot load shader code from resources.", innerException);
}
Как вы можете видеть, вы можете получить доступ к любому ресурсу в пути /res/...
Изменить aClass
к классу. Это также, как я загружаю ресурсы в тестах (androidTests)
- 1. Получить параметр из статического контекста в axis2
- 2. Как получить содержимое веб-ресурса?
- 3. Виртуальный метод из статического контекста
- 4. Получение ресурсов из статического контекста
- 5. getResources() из статического метода, без контекста
- 6. Как содержимое статического кэша?
- 7. Доступ к нестатической переменной из статического контекста
- 8. Доступ к ресурсу статического ресурса из xaml?
- 9. Способ получения нестатической информации из статического контекста
- 10. Ссылка на нестатические переменные из статического контекста
- 11. Yii2: Выполнение перенаправления из статического неконтролируемого контекста
- 12. Использование контекста статического приложения
- 13. Есть ли способ получить объект Session из статического контекста?
- 14. __callStatic(): создание объектов из статического контекста?
- 15. Android - executePendingTransactions нельзя ссылаться из статического контекста
- 16. Activity.this нельзя ссылаться из статического контекста
- 17. Нестационарный метод может ссылаться из статического контекста
- 18. Java - нельзя ссылаться из статического контекста
- 19. Вызов статического метода из нестатического контекста
- 20. Non-статический метод ссылки из статического контекста
- 21. печать массивы из не статического контекста
- 22. нестатический метод аннота ссылается из статического контекста
- 23. Как получить имя ресурса из объекта ресурса?
- 24. Как получить имя ресурса из идентификатора ресурса
- 25. Как я могу получить объект Глобального ресурса вне контекста страницы?
- 26. Как ссылаться на нестатические имена переменных из статического контекста?
- 27. Как получить URL-адрес TypeSafe для статического ресурса в Yesod
- 28. Как получить FREContext из контекста?
- 29. Как получить приложение из контекста
- 30. Закрытие статического ресурса в Java
аккуратный трюк, спасибо. хорошо, поэтому нет стандартного апи? – 2010-12-09 18:03:09
Это стандарт, это не трюк XD – Cristian 2010-12-09 18:13:05
Я согласен, что это уродливый взлом. Никогда не назначать динамические значения статическому объекту – Bostone 2012-02-22 23:46:39