我发现R.string非常棒,可以将硬编码的字符串排除在代码之外,我希望在与应用程序中的模型一起工作的实用程序类中继续使用它来生成输出。例如,在本例中,我从活动外部的模型生成了一封电子邮件。
是否可以在上下文或活动之外使用getString ?我想我可以通过目前的活动,但似乎没有必要。如果我说错了,请指正!
编辑:我们可以在不使用上下文的情况下访问资源吗?
我发现R.string非常棒,可以将硬编码的字符串排除在代码之外,我希望在与应用程序中的模型一起工作的实用程序类中继续使用它来生成输出。例如,在本例中,我从活动外部的模型生成了一封电子邮件。
是否可以在上下文或活动之外使用getString ?我想我可以通过目前的活动,但似乎没有必要。如果我说错了,请指正!
编辑:我们可以在不使用上下文的情况下访问资源吗?
当前回答
以下是基于Khemraj Sharma的回答,这是Kotlin版本,有一个额外的扩展作为奖励:
class App: Application() {
override fun onCreate() {
super.onCreate()
mInstance = this
res = resources
}
companion object{
private var mInstance: App? = null
private var res: Resources? = null
fun getInstance(): App? {
return mInstance
}
fun getRes(): Resources? {
return res
}
}
}
然后我们可以创建一个扩展:
fun Int.resourceToString(): String {
return App.getRes()?.getString(this) ?: "Not Found"
}
并直接在任何资源id上使用扩展:
var asString = R.string.my_string.resourceToString()
其他回答
您可以在Kotlin中通过创建一个扩展Application的类来实现这一点,然后使用它的上下文来调用代码中的任何地方的资源
你的App类看起来是这样的
class App : Application() {
override fun onCreate() {
super.onCreate()
context = this
}
companion object {
var context: Context? = null
private set
}
}
在AndroidManifest.xml中声明你的Application类(非常重要)
<application
android:allowBackup="true"
android:name=".App" //<--Your declaration Here
...>
<activity
android:name=".SplashActivity" android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"/>
</application>
要访问字符串文件,请使用以下代码
App.context?.resources?.getText(R.string.mystring)
内部活动:
Text(text = getString(android.R.string.yes))
内部无活动:
Text(text = Resources.getSystem().getString(android.R.string.yes))
OR
Text(text = stringResource(android.R.string.yes))
AppCompatActivity 伴星
活动代码:
class MainActivity : AppCompatActivity() {
companion object {
lateinit var instance: AppCompatActivity
private set
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
instance = this
}
}
从任何地方获取资源:
val text = MainActivity.instance.getString(R.string.task_1)
这应该让你从任何地方访问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"
>
如果你看到这里有什么问题,请告诉我,谢谢。:)
以下是基于Khemraj Sharma的回答,这是Kotlin版本,有一个额外的扩展作为奖励:
class App: Application() {
override fun onCreate() {
super.onCreate()
mInstance = this
res = resources
}
companion object{
private var mInstance: App? = null
private var res: Resources? = null
fun getInstance(): App? {
return mInstance
}
fun getRes(): Resources? {
return res
}
}
}
然后我们可以创建一个扩展:
fun Int.resourceToString(): String {
return App.getRes()?.getString(this) ?: "Not Found"
}
并直接在任何资源id上使用扩展:
var asString = R.string.my_string.resourceToString()