2010-12-08 2 views

ответ

310
  1. Создайте подкласс Application, например public class App extends Application {
  2. Установите атрибут вашего <application> тега в AndroidManifest.xmlandroid:name, чтобы указать на новый класс, например, android:name=".App"
  3. Метод 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()).

+0

аккуратный трюк, спасибо. хорошо, поэтому нет стандартного апи? – 2010-12-09 18:03:09

+1

Это стандарт, это не трюк XD – Cristian 2010-12-09 18:13:05

+0

Я согласен, что это уродливый взлом. Никогда не назначать динамические значения статическому объекту – Bostone 2012-02-22 23:46:39

92

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

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

Вы можете использовать их везде в вашем приложении, даже в статических деклараций констант! Но только для системных ресурсов!

0

думаю, больше дорога возможен. Но иногда я использую это решение. (Полный глобальный):

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(); 
0

В классе, где вы реализуете статической функции, вы можете вызвать частный \ общественного метода из этого класса. Частный \ открытый метод может получить доступ к 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'); 
0

, если у вас есть контекст, я имею в виду внутри;

public void onReceive(Context context, Intent intent){ 

}

вы можете использовать этот код, чтобы получить ресурсы:

context.getResources().getString(R.string.app_name); 
3

одноэлементных:

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.

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

1

Другим решение:

Если у вас есть статический подкласс в нестатическом внешнем классе, вы можете получить доступ к ресурсам внутри подкласса с помощью статических переменных внешнего класса, который инициализирует по созданию внешний класс. Как

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.

1

Существует также другая возможность. Я загружаю 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)

Смежные вопросы