我发现R.string非常棒,可以将硬编码的字符串排除在代码之外,我希望在与应用程序中的模型一起工作的实用程序类中继续使用它来生成输出。例如,在本例中,我从活动外部的模型生成了一封电子邮件。
是否可以在上下文或活动之外使用getString ?我想我可以通过目前的活动,但似乎没有必要。如果我说错了,请指正!
编辑:我们可以在不使用上下文的情况下访问资源吗?
我发现R.string非常棒,可以将硬编码的字符串排除在代码之外,我希望在与应用程序中的模型一起工作的实用程序类中继续使用它来生成输出。例如,在本例中,我从活动外部的模型生成了一封电子邮件。
是否可以在上下文或活动之外使用getString ?我想我可以通过目前的活动,但似乎没有必要。如果我说错了,请指正!
编辑:我们可以在不使用上下文的情况下访问资源吗?
当前回答
# #独特的方法
# # App.getRes () .getString (R.string.some_id)
这将在应用程序的任何地方工作(Util类,对话框,片段或 应用程序中的任何类)
(1)创建或编辑(如果已经存在)你的应用程序类。
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;
}
}
(2)在manifest.xml <application标签中添加name字段。
<application
android:name=".App"
...
>
...
</application>
现在可以开始了。在应用程序的任何地方使用app. getres (). getstring (r.r string.some_id)。
其他回答
不幸的是,你能访问任何字符串资源的唯一方法是一个上下文(即一个活动或服务)。在这种情况下,我通常做的是简单地要求调用者传递上下文。
# #独特的方法
# # App.getRes () .getString (R.string.some_id)
这将在应用程序的任何地方工作(Util类,对话框,片段或 应用程序中的任何类)
(1)创建或编辑(如果已经存在)你的应用程序类。
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;
}
}
(2)在manifest.xml <application标签中添加name字段。
<application
android:name=".App"
...
>
...
</application>
现在可以开始了。在应用程序的任何地方使用app. getres (). getstring (r.r string.some_id)。
如果你有一个在活动中使用的类,并且你想要访问该类中的资源,我建议你在类中定义一个context作为私有变量,并在构造函数中初始化它:
public class MyClass (){
private Context context;
public MyClass(Context context){
this.context=context;
}
public testResource(){
String s=context.getString(R.string.testString).toString();
}
}
在你的活动中展现一流的一面:
MyClass m=new MyClass(this);
是的,我们可以不使用“上下文”来访问资源
你可以使用:
Resources.getSystem().getString(android.R.string.somecommonstuff)
... 在应用程序的任何地方,甚至在静态常量声明中。 不幸的是,它只支持系统资源。
对于本地资源,请使用此解决方案。这不是小事,但很有效。
这应该让你从任何地方访问applicationContext,允许你在任何可以使用它的地方获得applicationContext;Toast, getString(), sharedPreferences等。
单例模式:
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子类中初始化单例:
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"
>
如果你看到这里有什么问题,请告诉我,谢谢。:)