web-dev-qa-db-ja.com

コンテキストまたはアクティビティ外のgetString

ハードコードされた文字列をコードに入れないようにするためにR.stringが非常に優れていることを発見しました。アプリケーションのモデルと連携して出力を生成するユーティリティクラスでそれを使い続けたいと思います。たとえば、この場合、アクティビティ外のモデルからメールを生成しています。

getStringまたはContextの外部でActivityを使用することは可能ですか??現在のアクティビティを渡すことができると思いますが、不要なようです。私が間違っている場合は私を修正してください!

編集:Contextを使用してリソースにアクセスできますかwithout

224
SapphireSun

はい、 `Context`を使用せずにリソースにアクセスできます

次を使用できます。

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

...静的定数宣言であっても、アプリケーションのどこにでも。残念ながら、システムリソースのみをサポートしています

ローカルリソースの場合は このソリューション を使用します。些細なことではありませんが、機能します。

378
Gangnus

残念ながら、文字列リソースにアクセスできる唯一の方法は、Context(つまり、ActivityまたはService)を使用することです。この場合に通常行うことは、呼び出し側にコンテキストを渡すことを単に要求することです。

106
Erich Douglass

MyApplicationでは、Applicationを拡張します。

public static Resources resources;

MyApplicationonCreateで:

resources = getResources();

これで、アプリケーションのどこからでもこのフィールドを使用できます。

31
konmik

ところで、シンボルが見つかりませんエラーの理由の1つは、IDEがAndroid.Rをインポートしたことです。あなたのものではなくクラス。 import Android.R;import 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);
}
21

ユニークなアプローチ

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

これはアプリのどこでも動作します。 (tilクラス、ダイアログ、フラグメント、またはアプリ内の任意のクラス

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

}

(2)manifest.xml<applicationタグに名前フィールドを追加します。

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

これで準備完了です。アプリ内の任意の場所でApp.getRes().getString(R.string.some_id)を使用します。

10
Khemraj

アクティビティで使用するクラスがあり、そのクラスのリソースにアクセスする場合は、クラスでプライベート変数としてコンテキストを定義し、コンストラクターで初期化することをお勧めします。

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);
4
Malus Jan

ケムラージの応答からの最良のアプローチ:

アプリクラス

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
1

contextおよびactivityなしでこのようなものを使用する方が良い

Resources.getSystem().getString(R.string.my_text)
0
reza_khalafi

これにより、どこからでもapplicationContextにアクセスできるようになり、使用できる任意の場所でapplicationContextを取得できるようになります。 ToastgetString()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();で呼び出します。アプリケーションを閉じるときにこれをクリアする必要があるので、これをいつでもクリアする必要はありません。

このApplicationサブクラスを使用するには、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"
    >

ここで何かおかしいと思ったら教えてください、ありがとう。 :)

0
Versa