我如何从静态上下文获取资源内容?

我想从xml文件中读取string,然后在窗口小部件上执行其他任何类似setText的事情,所以如何在没有活动对象的情况下调用getResources()

  1. 创buildApplication的子类,例如public class App extends Application {
  2. AndroidManifest.xml设置你的<application>标签的android:name属性指向你的新类,例如android:name=".App"
  3. 在应用程序实例的onCreate()方法中,将上下文(例如this )保存到名为mContext的静态字段中,并创build一个返回该字段的静态方法,例如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) 

你可以在应用程序中的任何地方使用它们,即使在静态常量声明中! 但只有系统资源!

单身人士:

 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子类中初始化Singleton:

 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();调用它ApplicationContextSingleton.getInstance.getApplicationContext(); 你不需要在任何时候清楚这一点,因为当申请closures时,无论如何都是这样。

记得要更新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(),也是应用程序子类不能使用的地方。

如果您在这里发现任何问题,请告诉我,谢谢。 🙂

另一个scheme

如果在非静态外部类中有一个静态子类,那么可以通过外部类中的静态variables来访问子类中的资源,这些variables是在创build外部类时初始化的。 喜欢

 public class Outerclass { static String resource1 public onCreate() { resource1 = getString(R.string.text); } public static class Innerclass { public StringGetter (int num) { return resource1; } } } 

我用它作为我的FragmentActivity中的静态FragmentPagerAdapter的getPageTitle(int位置)函数,这是因为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); } 

正如你所看到的,你可以访问path /res/...任何资源/res/... aClass更改为你的类。 这也是我如何加载testing资源(androidTests)

我想,更多的方式是可能的。 但有时候,我使用这个解决scheme。 (全球全球):

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

在你的类中,在你实现静态函数的地方,你可以调用这个类的private \ public方法。 private \ public方法可以访问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)); } } 

并从其他class级\活动,你可以打电话:

 Text.setColor('some EditText you initialized'); 

如果你有一个背景,我的意思是在里面;

 public void onReceive(Context context, Intent intent){ 

}

你可以使用这个代码来获取资源:

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