getString在Context或Activity之外
我发现R.string
非常棒,可以将代码中的硬编码string保留下来,我还想继续在一个工具类中使用它,该工具类与我的应用程序中的模型一起工作来生成输出。 例如,在这种情况下,我正在从活动外的模型生成一封电子邮件。
是否有可能在Context
或Activity
之外使用getString
? 我想我可以通过目前的活动,但似乎没有必要。 请纠正我,如果我错了!
编辑:我们可以访问资源, 而不使用Context
?
是的,我们可以不使用“上下文”来访问资源
您可以使用:
Resources.getSystem().getString(android.R.string.somecommonstuff)
…在你的应用程序中的任何地方,甚至在静态常量声明中。 不幸的是,它只支持系统资源 。
对于本地资源使用此解决scheme 。 这不是微不足道的,但它的工作原理。
不幸的是,你可以访问任何string资源的唯一方法是使用Context
(即Activity
或Service
)。 我通常在这种情况下做的是简单地要求调用者通过上下文。
在扩展Application
MyApplication
:
public static Resources resources;
在MyApplication
的onCreate
:
resources = getResources();
现在,您可以在应用程序的任何地方使用此字段。
顺便说一句, 符号未find错误的原因之一可能是你的IDE导入android.R; 而不是你的。 只要改变导入android.R; 导入your.namespace.R;
所以2个基本的东西可以在不同的类中看到string:
//make sure you are importing the right R class import your.namespace.R; //don't forget about the context public void some_method(Context context) { context.getString(R.string.YOUR_STRING); }
如果你有一个你在一个活动中使用的类,并且想要访问该类中的资源,我build议你在类中定义一个上下文作为私有variables,并在构造函数中初始化它:
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);
这应该让你从任何地方访问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
子类中初始化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" >
如果您在这里发现任何问题,请告诉我,谢谢。 🙂
我用getContext().getApplicationContext().getString(R.string.nameOfString);
这个对我有用。