【问题标题】:call getString(R.strings....) from class?从课堂上调用 getString(R.strings....)?
【发布时间】:2011-11-19 05:48:30
【问题描述】:

有没有办法从一个单独的类中使用 getString 方法?

我的字符串 xml 中存储了一个字符串,我想在对象中使用该字符串...但该方法在对象中甚至不可用...

有什么建议吗?

【问题讨论】:

标签: android class object android-context


【解决方案1】:

在你的 java 文件中试试这个:

String myString = getResources().getString(R.string.MY_STRING)

现在使用这个字符串对象。

【讨论】:

  • getResources() 是 Context 类的方法。如果没有有效的上下文引用,您将无法使用它
【解决方案2】:

getString()Context 类的一个方法¹。如果您在单独的类中需要它(不扩展 Context),通常最好将它作为单独的参数提供给需要它的方法。

例子:

public void logString(Context c, int stringId) {
    Log.d("TAG", c.getString(stringId));
}

有一点很重要: 永远不要将上下文存储在单独的类中。
提供论据。否则,如果存储上下文的对象比上下文最初所属的对象(例如活动)寿命更长,您将泄漏内存并破坏整个 android 生命周期。

¹ getString() 也可以从 Resources 类中使用 - 您可以通过 Context.getResources() 获得它

【讨论】:

  • 感谢我最终将上下文传递给对象,因为我可能会扩展它以使用更多字符串,所以我不想传递太多参数,因为对象从网络服务器获取数据...
  • 从网络获取数据并使用上下文:根据您的课程的工作方式,我建议您最好构建一个Service(它扩展了上下文)。这适用于 android 生命周期并提供您需要的内容。
【解决方案3】:

编辑: 以下将不起作用。我在另一个网站上阅读了这篇文章并认为它有效,但我只是在我的应用程序中尝试了它并不断收到错误消息。问题是,它会编译,但你会得到一个运行时异常。

这适用于任何 java 类:

import android.content.res.Resources

Resources.getSystem().getString(R.string.blah);

【讨论】:

  • 感谢您的更新。我不记得为什么我接受了您的回答,但这绝对行不通...
  • studio 找不到 getSystem() 方法
【解决方案4】:

这里的解决方案是确保您的对象具有对应用程序上下文的引用

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);
    }
}

显然你必须在创建对象或调用方法时提供上下文

【讨论】:

    【解决方案5】:

    资源文件: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
    

    【讨论】:

    • studio 找不到 getSystem() 方法
    • 它可以获取系统定义的字符串。如果您尝试获取应用程序的 string.xml 中定义的字符串,这将不起作用。
    【解决方案6】:

    如果您无法将上下文作为参数传递,请创建另一个类,将所有静态数据放在其中。

    示例:

    public class StaticData {
        public static String BASE_URL = "https://stackoverflowrocks.com";
    }
    

    并通过直接调用从其他类中获取该字符串 静态数据.BASE_URL

    干净整洁。

    【讨论】:

      【解决方案7】:

      这可行,但仅适用于 SYSTEM 资源:

      import android.content.res.Resources
      Resources.getSystem().getString(R.string.blah);
      

      参考:https://stackoverflow.com/a/40917607/8994882

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 2018-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        相关资源
        最近更新 更多