getString在Context或Activity之外

时间:2010-11-23 06:23:18

标签: java android string android-resources android-context

我发现R.string非常棒,可以将硬编码的字符串保留在我的代码中,并且我希望继续在实用程序类中使用它,该实用程序类可以在我的应用程序中使用模型来生成输出。例如,在这种情况下,我正在从活动之外的模型生成电子邮件。

是否可以在getStringContext 之外使用Activity?我想我可以通过当前的活动,但似乎没必要。如果我错了,请纠正我!

编辑:我们可以使用Context

访问资源而不使用吗?

14 个答案:

答案 0 :(得分:374)

是的,我们可以在不使用`Context`

的情况下访问资源

您可以使用:

Resources.getSystem().getString(android.R.string.somecommonstuff)

...应用程序中的任何地方,即使在静态常量声明中也是如此。 不幸的是,它仅支持系统资源

对于本地资源,请使用this solution。这不是微不足道的,但它确实有效。

答案 1 :(得分:106)

不幸的是,您可以访问任何字符串资源的唯一方法是使用Context(即ActivityService)。在这种情况下我通常做的只是要求调用者传入上下文。

答案 2 :(得分:31)

MyApplicationApplication

public static Resources resources;

MyApplication的{​​{1}}:

onCreate

现在,您可以在应用程序的任何位置使用此字段。

答案 3 :(得分:21)

BTW,符号未找到错误的原因之一可能是您的IDE导入了android.R;而不是你的一个。只需将导入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);
}

答案 4 :(得分:9)

唯一方法

RewriteEngine on RewriteBase /amit/public/ RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{REQUEST_FILENAME} !-l RewriteCond ${REQUEST_FILENAME} !-d RewriteRule ^(.+?)/?$ $1.php [L]

  

这将在应用程序中的任何地方工作。 (实用程序类,对话框,片段或   您应用中的任何课程

(1)创建或编辑App.getRes().getString(R.string.some_id)类(如果已经存在)。

Application

(2)将名称字段添加到您的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; } } manifest.xml标签中。

<application

现在你很好。在应用程序中的任何地方使用<application android:name=".App" ... > ... </application>

答案 5 :(得分:4)

如果您有一个在活动中使用的类,并且您想要访问该类中的ressource,我建议您在类中将上下文定义为私有变量并在构造函数中初始化它:

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

答案 6 :(得分:1)

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

答案 7 :(得分:0)

这可以让您从任何地方访问applicationContext,这样您就可以在任何可以使用它的地方获得applicationContext; ToastgetString()sharedPreferences

The Singleton:

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"
    >

如果你在这里看到任何错误,请告诉我,谢谢。 :)

答案 8 :(得分:0)

最好使用没有上下文活动

这样的东西
Resources.getSystem().getString(R.string.my_text)

答案 9 :(得分:0)

以某种方式不喜欢存储静态值的hacky解决方案,因此提出了更长的时间,但是可以测试的干净版本。

找到2种可行的方法-

  1. 将context.resources作为参数传递给需要字符串资源的类。很简单。如果无法作为参数传递,请使用setter。

例如

data class MyModel(val resources: Resources) {
    fun getNameString(): String {
        resources.getString(R.string.someString)
    }
}
  1. 使用数据绑定(尽管需要片段/活动)

在阅读之前:此版本使用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)

有时,您需要根据模型中的字段更改文本。因此,您也将数据绑定到该模型,并且由于您的活动/片段知道该模型,因此您可以很好地获取值,然后根据该值对字符串进行数据绑定。

答案 10 :(得分:0)

您可以在 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)

答案 11 :(得分:-2)

这就是我所做的 在您的MainActivity中,为上下文创建一个静态变量,如下所示:

public static Context mContext;

,然后在onCreate()中初始化mContext;

mContext = this;

然后,在您要访问上下文的文件中,说

private Context context = MainActivity.mContext;

现在,您可以通过以下方式获取字符串资源,

String myString = context.getResources().getString(R.string.resource_id);

答案 12 :(得分:-2)

Kotlin:完美的决定 02.03.2021


  • 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)

P.S Vel_daN: 喜欢你所做的。

答案 13 :(得分:-8)

我用过 getContext().getApplicationContext().getString(R.string.nameOfString); 它对我有用。