Answers:
您可以使用:
Resources.getSystem().getString(android.R.string.somecommonstuff)
...在应用程序中的任何地方,甚至在静态常量声明中也是如此。不幸的是,它仅支持系统资源。
对于本地资源,请使用此解决方案。这并非微不足道,但可以。
android.content.res.Resources$NotFoundException: String resource ID #0x7f0f0061
不幸的是,访问任何字符串资源的唯一方法是使用一个Context
(即an Activity
或Service
)。在这种情况下,我通常要做的就是简单地要求调用者在上下文中传递。
ctx.getString(ctx.R.string.blah);
Context
以便您可以从Activity或Service中使用它。
ctx.R.string.blah
,只需使用R.string.blah
symbol not found error
而来,但请确保您已R
导入该类的顶部。
在中MyApplication
,它扩展为Application
:
public static Resources resources;
在MyApplication
的onCreate
:
resources = getResources();
现在,您可以在应用程序中的任何位置使用此字段。
顺便说一句,未找到符号错误的原因之一可能是您的IDE导入了android.R; 类而不是你的。只需更改import android.R; 以进口your.namespace.R;
因此,在不同的类中使字符串可见的2个基本事项:
//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);
}
App.getRes().getString(R.string.some_id)
这将在应用程序中的任何地方工作。(实用程序类,对话框,片段或应用程序中的任何类)
(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 getResourses() {
return res;
}
}
(2)在manifest.xml
<application
标签中添加名称字段。
<application
android:name=".App"
...
>
...
</application>
现在你很好。App.getRes().getString(R.string.some_id)
在应用程序中的任何地方使用。
如果您有在活动中使用的类,并且希望访问该类中的资源,则建议您将上下文定义为类中的私有变量,并在构造函数中将其初始化:
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();
您不需要在任何时候清除它,因为当应用程序关闭时,它还是会伴随它。
记住要更新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的最佳方法:
应用类别
class App : Application() {
companion object {
lateinit var instance: Application
lateinit var resourses: Resources
}
// MARK: - Lifecycle
override fun onCreate() {
super.onCreate()
instance = this
resourses = resources
}
}
清单中的声明
<application
android:name=".App"
...>
</application>
常量类
class Localizations {
companion object {
val info = App.resourses.getString(R.string.info)
}
}
使用
textView.text = Localizations.info
最好使用没有上下文和活动的类似方法:
Resources.getSystem().getString(R.string.my_text)
不知何故不喜欢存储静态值的hacky解决方案,因此提出了更长的时间,但可以测试的干净版本。
发现2种可能的方法-
例如
data class MyModel(val resources: Resources) {
fun getNameString(): String {
resources.getString(R.string.someString)
}
}
阅读之前:此版本使用 Data binding
XML-
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="someStringFetchedFromRes"
type="String" />
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{someStringFetchedFromRes}" />
</layout>
活动/片段
val binding = NameOfYourBinding.inflate(inflater)
binding.someStringFetchedFromRes = resources.getString(R.string.someStringFetchedFromRes)
有时,您需要根据模型中的字段更改文本。因此,您也将对该模型进行数据绑定,并且由于您的活动/片段了解该模型,因此您可以很好地获取值,然后根据该值对字符串进行数据绑定。
您可以在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)
这是我所做的,在您的MainActivity中,为上下文创建一个静态变量,如下所示:
public static Context mContext;
并在onCreate()中初始化mContext;
mContext = this;
然后,在要访问上下文的文件中说:
private Context context = MainActivity.mContext;
现在,您可以通过以下方式获取字符串资源,
String myString = context.getResources().getString(R.string.resource_id);
我用过getContext().getApplicationContext().getString(R.string.nameOfString);
它对我有用
。
getContext()
到处都有吗?