我发现R.string非常棒,可以将硬编码的字符串排除在代码之外,我希望在与应用程序中的模型一起工作的实用程序类中继续使用它来生成输出。例如,在本例中,我从活动外部的模型生成了一封电子邮件。

是否可以在上下文或活动之外使用getString ?我想我可以通过目前的活动,但似乎没有必要。如果我说错了,请指正!

编辑:我们可以在不使用上下文的情况下访问资源吗?


当前回答

# #独特的方法

# # App.getRes () .getString (R.string.some_id)

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

(1)创建或编辑(如果已经存在)你的应用程序类。

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 getRes() {
        return res;
    }

}

(2)在manifest.xml <application标签中添加name字段。

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

现在可以开始了。在应用程序的任何地方使用app. getres (). getstring (r.r string.some_id)。

其他回答

在MyApplication中,扩展Application:

public static Resources resources;

在MyApplication的onCreate中:

resources = getResources();

现在您可以在应用程序中的任何地方使用该字段。

不幸的是,你能访问任何字符串资源的唯一方法是一个上下文(即一个活动或服务)。在这种情况下,我通常做的是简单地要求调用者传递上下文。

如果你正在使用Hilt,你实际上可以注入上下文:

@Module
@InstallIn(SingletonComponent::class)
interface ResourceProvider {

    companion object {
    
    @Provides
    @Singleton
    @MyQualifier
    fun providesBaseUrl(@ApplicationContext context: Context): String = with(context) {
      getString(R.string.my_value)
    }
  }
}

从赫姆拉吉的回应来看,最好的方法是:

应用程序类

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

这应该让你从任何地方访问applicationContext,允许你在任何可以使用它的地方获得applicationContext;Toast, getString(), sharedPreferences等。

单例模式:

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来使用这个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"
    >

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