los*_*aby 160 java static android const android-resources
我想xml
在我做很多其他事情之前从文件中读取字符串,比如setText
在窗口小部件上做什么,所以如果没有要调用的活动对象,我怎么能这样做getResources()
呢?
Cri*_*ian 367
Application
例如,创建一个子类public class App extends Application {
android:name
属性设置为指向新类,例如<application>
AndroidManifest.xml
android:name=".App"
onCreate()
app实例的方法中,将上下文(例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以使用:App.getContext()
每当你想获得一个上下文,然后getResources()
(或App.getContext().getResources()
).
Gan*_*nus 98
使用
Resources.getSystem().getString(android.R.string.cancel)
Run Code Online (Sandbox Code Playgroud)
您可以在应用程序的任何地方使用它们,即使在静态常量声明中也是如此!但仅限系统资源!
Vit*_*lyi 20
我的 Kotlin 解决方案是使用静态应用程序上下文:
class App : Application() {
companion object {
lateinit var instance: App private set
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
Run Code Online (Sandbox Code Playgroud)
还有我到处使用的 Strings 类:
object Strings {
fun get(@StringRes stringRes: Int, vararg formatArgs: Any = emptyArray()): String {
return App.instance.getString(stringRes, *formatArgs)
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以有一种干净的方式来获取资源字符串
Strings.get(R.string.some_string)
Strings.get(R.string.some_string_with_arguments, "Some argument")
Run Code Online (Sandbox Code Playgroud)
请不要删除这个答案,让我保留一个。
我用App.getRes()
而不是App.getContext().getResources()
(正如@Cristian 回答的那样)
在代码中的任何地方使用都非常简单!
因此,这是一个独特的解决方案,您可以通过它从任何地方访问资源,例如Util class
.
(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 getRes() {
return res;
}
}
Run Code Online (Sandbox Code Playgroud)
(2) 将名称字段添加到您的manifest.xml
<application
标签中。(或如果已经存在则跳过)
<application
android:name=".App"
...
>
...
</application>
Run Code Online (Sandbox Code Playgroud)
现在你可以走了。
App.getRes().getString(R.string.some_id)
在代码中的任何地方使用。还有另一种可能性。我从这样的资源加载 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);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以访问路径/res/...
Change 中的任何资源aClass
到您的班级。这也是我在测试中加载资源的方式(androidTests)
归档时间: |
|
查看次数: |
116890 次 |
最近记录: |