我发现 R.string
非常适合将硬编码字符串保留在我的代码之外,并且我希望继续在实用程序类中使用它,该实用程序类与我的应用程序中的模型配合使用以生成输出。例如,在本例中,我从活动之外的模型生成一封电子邮件。
是否可以在 Context
或 Activity
之外使用 getString
?我想我可以通过当前的活动,但这似乎没有必要。如果我错了请纠正我!
编辑:我们可以在不使用Context
的情况下访问资源吗?
I've found the R.string
pretty awesome for keeping hardcoded strings out of my code, and I'd like to keep using it in a utility class that works with models in my application to generate output. For instance, in this case I am generating an email from a model outside of the activity.
Is it possible to use getString
outside a Context
or Activity
? I suppose I could pass in the current activity, but it seems unnecessary. Please correct me if I'm wrong!
Edit: Can we access the resources without using Context
?
发布评论
评论(18)
是的,我们可以在不使用“Context”的情况下访问资源
使用:
。您可以在应用程序中的任何地方 ...,甚至在静态常量声明中。
不幸的是,它仅支持系统资源。
对于本地资源,请使用此解决方案。这不是微不足道的,但它确实有效。
Yes, we can access resources without using `Context`
You can use:
... everywhere in your application, even in static constants declarations.
Unfortunately, it supports the system resources only.
For local resources use this solution. It is not trivial, but it works.
不幸的是,访问任何字符串资源的唯一方法是使用
Context
(即Activity
或Service
)。在这种情况下,我通常所做的就是简单地要求调用者传递上下文。Unfortunately, the only way you can access any of the string resources is with a
Context
(i.e. anActivity
orService
). What I've usually done in this case, is to simply require the caller to pass in the context.在
MyApplication
中,它扩展了Application
:在
MyApplication
的onCreate
中:现在您可以在任何位置使用此字段您的申请。
In
MyApplication
, which extendsApplication
:In
MyApplication
'sonCreate
:Now you can use this field from anywhere in your application.
##独特的方法
##
App.getRes().getString(R.string.some_id)
(1) 创建或编辑(如果已存在)您的
Application
类。(2) 将名称字段添加到 标记中。
manifest.xml
现在你可以走了。在应用程序中的任何位置使用
App.getRes().getString(R.string.some_id)
。##Unique Approach
##
App.getRes().getString(R.string.some_id)
(1) Create or Edit (if already exist) your
Application
class.(2) Add name field to your
manifest.xml
<application
tag.Now you are good to go. Use
App.getRes().getString(R.string.some_id)
anywhere in app.顺便说一句,符号未找到错误的原因之一可能是您的IDE导入了android.R;类而不是你的类。只需将 import android.R; 更改为 import your.namespace.R;
因此,要使字符串在不同的类中可见,需要做两件事:
BTW, one of the reason of symbol not found error may be that your IDE imported android.R; class instead of yours one. Just change import android.R; to import your.namespace.R;
So 2 basic things to get string visible in the different class:
Khemraj 响应中的最佳方法:
应用程序类
清单中的声明
常量类
使用
The best approach from the response of Khemraj:
App class
Declaration in the manifest
Constants class
Using
内部活动 :
内部非活动 :
Inside Activity :
Inside Non-Activity :
如果您有一个在活动中使用的类,并且希望访问该类中的资源,我建议您将上下文定义为类中的私有变量,并在构造函数中对其进行初始化:
在活动中创建类的实例:
If you have a class that you use in an activity and you want to have access the ressource in that class, I recommend you to define a context as a private variable in class and initial it in constructor:
Making an instant of class in your activity:
您可以在 Kotlin 中执行此操作,方法是创建一个扩展 Application 的类,然后使用其上下文调用代码中任意位置的资源
您的 App 类将如下所示
在 AndroidManifest.xml 中声明您的 Application 类(非常重要)
要访问例如字符串文件,请使用以下代码
You can do this in Kotlin by creating a class that extends Application and then use its context to call the resources anywhere in your code
Your App class will look like this
Declare your Application class in AndroidManifest.xml (very important)
To access e.g. a string file use the following code
遵循并基于 Khemraj Sharma 的答案,这是 Kotlin 版本,带有额外的扩展作为奖励:
然后我们可以创建一个扩展:
并直接在任何资源 id 上使用扩展:
Following and based on Khemraj Sharma's answer, this is the Kotlin version, with an extra extention as a bonus:
Then we can create an extension:
And use the extention directly on any resource id:
这应该让您可以从任何地方访问
applicationContext
,从而让您可以在任何可以使用它的地方获取applicationContext
;Toast
、getString()
、sharedPreferences
等。Singleton:
在您的
Application
子类中初始化 Singleton:如果我没有错,这给了你一个到 applicationContext 的钩子,用
ApplicationContextSingleton.getInstance.getApplicationContext(); 调用它
您不需要在任何时候清除它,因为当应用程序关闭时,它会随之消失。
请记住更新
AndroidManifest.xml
以使用此Application
子类:如果您发现这里有任何问题,请告诉我,谢谢。 :)
This should get you access to
applicationContext
from anywhere allowing you to getapplicationContext
anywhere that can use it;Toast
,getString()
,sharedPreferences
, etc.The Singleton:
Initialize the Singleton in your
Application
subclass:If I´m not wrong, this gives you a hook to applicationContext everywhere, call it with
ApplicationContextSingleton.getInstance.getApplicationContext();
You shouldn´t need to clear this at any point, as when application closes, this goes with it anyway.
Remember to update
AndroidManifest.xml
to use thisApplication
subclass:Please let me know if you see anything wrong here, thank you. :)
如果您使用 Hilt,您实际上可以注入上下文:
If you are using Hilt, you can actually inject the context:
不知何故,我不喜欢存储静态值的黑客解决方案,因此想出了一个更长但也可以测试的干净版本。
找到了两种可能的方法 - 将
例如
在阅读之前:此版本使用
数据绑定
XML-
活动/片段-
有时,您需要根据模型中的字段更改文本。因此,您也可以对该模型进行数据绑定,并且由于您的活动/片段了解该模型,因此您可以很好地获取该值,然后基于该值对字符串进行数据绑定。
Somehow didn't like the hacky solutions of storing static values so came up with a bit longer but a clean version which can be tested as well.
Found 2 possible ways to do it-
e.g.
Before you read: This version uses
Data binding
XML-
Activity/Fragment-
Sometimes, you need to change the text based on a field in a model. So you would data-bind that model as well and since your activity/fragment knows about the model, you can very well fetch the value and then data-bind the string based on that.
如果您想在上下文或活动之外使用 getString,您应该在构造函数或方法参数中具有上下文,以便您可以访问 getstring() 方法。
特别是在 Fragment 中,您应该确保 getActivity() 或 getContext() 不提供 null 值。
要避免 Fragment 中的 getActivity() 或 getContext() 为 null,请尝试以下操作:
声明一个变量:
现在覆盖 Fragment 的 onAttach 和 onDetach 方法:
现在无论您在哪里使用 getString() 方法,都使用 mContext 。
前任:
If you want to use getString Outside of a Context or Activity you should have context in constructor or method parameter so that you can access getstring() method.
Specially in Fragment You shoud ensure that getActivity() or getContext() are not providing null value.
To avoid null from getActivity() or getContext() in a Fragment try this :
Declare a variable :
now override onAttach and onDetach method of Fragment :
Now Use mContext whereever you are using getString() method.
ex:
要在没有上下文的情况下访问字符串资源,您可以创建一个单独的实用程序类并将应用程序上下文传递给它。下面是一个示例:
创建一个名为 ResourceUtils 的类:
在您的 Application 类中,使用应用程序上下文初始化 ResourceUtils:
现在,您可以使用 ResourceUtils.getString() 来访问没有上下文的字符串资源:
To access string resources without a context, you can create a separate utility class and pass the application context to it. Here's an example:
Create a class named ResourceUtils:
In your Application class, initialize the ResourceUtils with the application context:
Now, you can use ResourceUtils.getString() to access string resources without a context:
我用这段代码解决了这个问题
I resolve this problem with this code
活动代码:
从 AnyWhere 获取资源:
Activity code:
Getting a resource from AnyWhere:
我用过
getContext().getApplicationContext().getString(R.string.nameOfString);
这对我有用。
I used
getContext().getApplicationContext().getString(R.string.nameOfString);
It works for me.