代码之家  ›  专栏  ›  技术社区  ›  SapphireSun

在上下文或活动之外获取字符串

  •  219
  • SapphireSun  · 技术社区  · 14 年前

    我找到了 R.string 对于将硬编码字符串从代码中保留出来非常棒,我希望在一个实用程序类中继续使用它,该类与应用程序中的模型一起工作以生成输出。例如,在本例中,我从活动外部的模型生成电子邮件。

    可以用吗 getString 在外面 Context Activity ?我想我可以通过目前的活动,但这似乎是不必要的。如果我错了,请纠正我!

    编辑:我们可以访问资源吗 没有 使用 语境 ?

    10 回复  |  直到 14 年前
        1
  •  369
  •   Community Dunja Lalic    7 年前

    是的,我们可以在不使用'context'的情况下访问资源`

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

    …应用程序中的任何地方,甚至静态常量声明中。 仅系统资源 .

    供当地资源使用 this solution

        2
  •  106
  •   Erich Douglass    14 年前

    不幸的是,访问任何字符串资源的唯一方法是使用 Context Activity Service

        3
  •  30
  •   MD. Khairul Basar    7 年前

    MyApplication 延伸 Application :

    public static Resources resources;
    

    onCreate

    resources = getResources();
    

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

        4
  •  21
  •   Jan Naruszkiewicz    12 年前

    顺便说一句,这是 错误可能是您的IDE导入了android.r;类而不是您的类。只是改变 导入.namespace.r;

    //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);
    }
    
        5
  •  9
  •   Khemraj Sharma    5 年前

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

    manifest.xml <application 标签。

    <application
            android:name=".App"
            ...
            >
            ...
        </application>
    

    现在你可以走了。使用 app.getres().getstring(r.string.some_id)

        6
  •  4
  •   Malus Jan    8 年前

    如果您有一个在活动中使用的类,并且希望访问该类中的资源,我建议您在类中将上下文定义为私有变量,并在构造函数中对其进行初始化:

    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);
    
        7
  •  1
  •   Mickael Belhassen    5 年前

    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
    
        8
  •  0
  •   Versa    9 年前

    applicationContext 任何地方都能让你 应用程序上下文 任何可以使用它的地方; Toast getString() , sharedPreferences 等。

    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 子类:

    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 子类:

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

    如果你发现这里有什么问题,请告诉我,谢谢。:)

        9
  •  -2
  •   Soham Chari    6 年前

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

    public static Context mContext;
    

    mContext = this;
    

    然后,在要访问上下文的文件中,比如,

    private Context context = MainActivity.mContext;
    

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

    String myString = context.getResources().getString(R.string.resource_id);
    
        10
  •  -8
  •   vivynz    9 年前

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