getString在Context或Activity之外

我发现R.string非常棒,可以将代码中的硬编码string保留下来,我还想继续在一个工具类中使用它,该工具类与我的应用程序中的模型一起工作来生成输出。 例如,在这种情况下,我正在从活动外的模型生成一封电子邮件。

是否有可能在ContextActivity之外使用getString ? 我想我可以通过目前的活动,但似乎没有必要。 请纠正我,如果我错了!

编辑:我们可以访问资源, 而不使用Context

是的,我们可以不使用“上下文”来访问资源

您可以使用:

 Resources.getSystem().getString(android.R.string.somecommonstuff) 

…在你的应用程序中的任何地方,甚至在静态常量声明中。 不幸的是,它只支持系统资源

对于本地资源使用此解决scheme 。 这不是微不足道的,但它的工作原理。

不幸的是,你可以访问任何string资源的唯一方法是使用Context (即ActivityService )。 我通常在这种情况下做的是简单地要求调用者通过上下文。

在扩展Application MyApplication

 public static Resources resources; 

MyApplicationonCreate

 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 ,让你可以在任何地方使用applicationContextToastgetString()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); 这个对我有用。