我如何从静态上下文获取资源内容?
我想从xml
文件中读取string,然后在窗口小部件上执行其他任何类似setText
的事情,所以如何在没有活动对象的情况下调用getResources()
?
- 创build
Application
的子类,例如public class App extends Application {
- 在
AndroidManifest.xml
设置你的<application>
标签的android:name
属性指向你的新类,例如android:name=".App"
- 在应用程序实例的
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);