【发布时间】:2011-11-19 05:48:30
【问题描述】:
有没有办法从一个单独的类中使用 getString 方法?
我的字符串 xml 中存储了一个字符串,我想在对象中使用该字符串...但该方法在对象中甚至不可用...
有什么建议吗?
【问题讨论】:
-
这能回答你的问题吗? getString Outside of a Context or Activity
标签: android class object android-context
有没有办法从一个单独的类中使用 getString 方法?
我的字符串 xml 中存储了一个字符串,我想在对象中使用该字符串...但该方法在对象中甚至不可用...
有什么建议吗?
【问题讨论】:
标签: android class object android-context
在你的 java 文件中试试这个:
String myString = getResources().getString(R.string.MY_STRING)
现在使用这个字符串对象。
【讨论】:
getString() 是 Context 类的一个方法¹。如果您在单独的类中需要它(不扩展 Context),通常最好将它作为单独的参数提供给需要它的方法。
例子:
public void logString(Context c, int stringId) {
Log.d("TAG", c.getString(stringId));
}
有一点很重要: 永远不要将上下文存储在单独的类中。
提供论据。否则,如果存储上下文的对象比上下文最初所属的对象(例如活动)寿命更长,您将泄漏内存并破坏整个 android 生命周期。
¹ getString() 也可以从 Resources 类中使用 - 您可以通过 Context.getResources() 获得它
【讨论】:
Service(它扩展了上下文)。这适用于 android 生命周期并提供您需要的内容。
编辑: 以下将不起作用。我在另一个网站上阅读了这篇文章并认为它有效,但我只是在我的应用程序中尝试了它并不断收到错误消息。问题是,它会编译,但你会得到一个运行时异常。
这适用于任何 java 类:
import android.content.res.Resources
Resources.getSystem().getString(R.string.blah);
【讨论】:
这里的解决方案是确保您的对象具有对应用程序上下文的引用
Class Swag{
private Context ctx;
public Swag(Context ctx){
this.ctx = ctx;
}
public void doSomething(){
String something = ctx.getResources().getString(R.string.somestring);
...
}
// or like this
public void makeUpperCase(Context appContext){
appContext.getResources().getString(R.string.super_string_swag_yolo);
}
}
显然你必须在创建对象或调用方法时提供上下文
【讨论】:
资源文件:values/strings.xml
<resources>
<string name="app_name">App name</string>
<resources>
java
import android.content.res.Resources;
Resources.getSystem().getString(R.string.app_name);//result : App name
【讨论】:
如果您无法将上下文作为参数传递,请创建另一个类,将所有静态数据放在其中。
示例:
public class StaticData {
public static String BASE_URL = "https://stackoverflowrocks.com";
}
并通过直接调用从其他类中获取该字符串 静态数据.BASE_URL
干净整洁。
【讨论】:
这可行,但仅适用于 SYSTEM 资源:
import android.content.res.Resources
Resources.getSystem().getString(R.string.blah);
【讨论】: