304

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

getStringまたはの外で使用することは可能ですContextActivity?現在の活動を引き継ぐことができると思いますが、それは不要のようです。私が間違っているなら私を訂正してください!

編集:使用せずにリソースにアクセスできますContextか?

4

13 に答える 13

528

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

次を使用できます。

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

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

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

于 2012-01-06T23:21:14.933 に答える
114

残念ながら、文字列リソースのいずれかにアクセスできる唯一の方法は、ContextActivityまたはService)を使用することです。この場合、私が通常行ったことは、単に呼び出し元にコンテキストを渡すように要求することです。

于 2010-11-23T06:37:43.387 に答える
39

MyApplication、拡張しますApplication

public static Resources resources;

MyApplicationonCreate:_

resources = getResources();

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

于 2015-03-10T17:14:26.563 に答える
28

##ユニークなアプローチ

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

これはアプリのどこでも機能します。(Utilクラス、Dialog、Fragment、またはアプリ内の任意のクラス

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

}

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

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

今、あなたは行ってもいいです。App.getRes().getString(R.string.some_id)アプリ内のどこでも使用できます。

于 2018-07-11T07:32:29.240 に答える
24

ところで、シンボルが見つからないというエラーの理由の1つは、IDEがandroid.Rをインポートしたことである可能性があります。あなたのものの代わりにクラス。importandroid.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);
}
于 2012-05-24T06:30:21.810 に答える
4

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

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);
于 2016-03-13T07:14:25.757 に答える
2

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
于 2019-02-14T08:53:05.590 に答える
1

これにより、どこからでもアクセスできるようになり、それを使用できる場所applicationContextならどこからでもアクセスできるようになります。、、、など。applicationContextToastgetString()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"
    >

ここで何か問題がありましたらお知らせください。ありがとうございます。:)

于 2015-09-25T12:16:17.093 に答える
1

Kotlinでこれを行うには、Applicationを拡張するクラスを作成し、そのコンテキストを使用してコード内の任意の場所でリソースを呼び出します。

Appクラスは次のようになります

 class App : Application() {
    override fun onCreate() {
        super.onCreate()
        context = this
    }

    companion object {
        var context: Context? = null
            private set
    }
}

AndroidManifest.xmlでアプリケーションクラスを宣言します(非常に重要)

<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)
于 2019-12-29T06:05:20.830 に答える
0

どういうわけか、静的な値を格納するというハッキーなソリューションが気に入らなかったので、少し長くなりましたが、テストできるクリーンなバージョンも思いつきました。

それを行うための2つの可能な方法を見つけました-

  1. 文字列リソースが必要なクラスに、context.resourcesをパラメーターとして渡します。かなりシンプルです。paramとして渡すことができない場合は、セッターを使用してください。

例えば

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)

モデルのフィールドに基づいてテキストを変更する必要がある場合があります。したがって、そのモデルもデータバインドします。アクティビティ/フラグメントはモデルを認識しているため、値を取得して、それに基づいて文字列をデータバインドできます。

于 2019-12-19T05:23:12.027 に答える
0

コンテキストまたはアクティビティの外部でgetStringを使用する場合は、getstring()メソッドにアクセスできるように、コンストラクターまたはメソッドパラメーターにコンテキストを含める必要があります。特にフラグメントでは、getActivity()またはgetContext()がnull値を提供していないことを確認する必要があります。フラグメント内のgetActivity()またはgetContext()からのnullを回避するには、次のことを試してください。変数を宣言します。

Context mContext;

FragmentのonAttachおよびonDetachメソッドをオーバーライドするようになりました。

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mContext = context;
}

@Override
public void onDetach() {
    super.onDetach();
    mContext = null;
}

ここで、getString()メソッドを使用している場合は常にmContextを使用します。元:

        Toast.makeText(mContext,  mContext.getString(R.string.sample_toast_from_string_file), Toast.LENGTH_SHORT).show();
于 2021-12-23T18:49:34.983 に答える
-3

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

AnyWhereからリソースを取得する:

val text = MainActivity.instance.getString(R.string.task_1)

PS Vel_daN: あなたがすることを愛してください。

于 2021-03-02T16:22:16.123 に答える
-11

私は getContext().getApplicationContext().getString(R.string.nameOfString); それを使用しましたそれは私のために働きます。

于 2015-02-16T15:14:06.460 に答える