ハードコードされた文字列をコードに入れないようにするためにR.string
が非常に優れていることを発見しました。アプリケーションのモデルと連携して出力を生成するユーティリティクラスでそれを使い続けたいと思います。たとえば、この場合、アクティビティ外のモデルからメールを生成しています。
getString
またはContext
の外部でActivity
を使用することは可能ですか??現在のアクティビティを渡すことができると思いますが、不要なようです。私が間違っている場合は私を修正してください!
編集:Context
を使用してリソースにアクセスできますかwithout?
次を使用できます。
Resources.getSystem().getString(Android.R.string.somecommonstuff)
...静的定数宣言であっても、アプリケーションのどこにでも。残念ながら、システムリソースのみをサポートしています。
ローカルリソースの場合は このソリューション を使用します。些細なことではありませんが、機能します。
残念ながら、文字列リソースにアクセスできる唯一の方法は、Context
(つまり、Activity
またはService
)を使用することです。この場合に通常行うことは、呼び出し側にコンテキストを渡すことを単に要求することです。
MyApplication
では、Application
を拡張します。
public static Resources resources;
MyApplication
のonCreate
で:
resources = getResources();
これで、アプリケーションのどこからでもこのフィールドを使用できます。
ところで、シンボルが見つかりませんエラーの理由の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);
}
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)
を使用します。
アクティビティで使用するクラスがあり、そのクラスのリソースにアクセスする場合は、クラスでプライベート変数としてコンテキストを定義し、コンストラクターで初期化することをお勧めします。
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);
ケムラージの応答からの最良のアプローチ:
アプリクラス
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
contextおよびactivity:なしでこのようなものを使用する方が良い
Resources.getSystem().getString(R.string.my_text)
これにより、どこからでも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();
で呼び出します。アプリケーションを閉じるときにこれをクリアする必要があるので、これをいつでもクリアする必要はありません。
この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"
>
ここで何かおかしいと思ったら教えてください、ありがとう。 :)