web-dev-qa-db-ja.com

コンテキストなしでリソースにアクセスする

ユーティリティクラスが使用できるように、URLなどの構成をリソースフォルダに配置しようとしています。ただし、どこからでもアクティビティからコンテキストを渡したくありません。リソースにアクセスするためのコンテキストを使用せずに、パス名を介してリソースにアクセスできるようにしたい(assets /はこの用途のために設計されたようです)。

この特定のケースでは、インスタンス化されたときに、シングルトンが構成で何かを使用するようにします。インスタンス化中に一度だけ、それ以外のリソースは必要ありません。したがって、getInstance()が呼び出されるたびにコンテキストを渡さなければならないのは、完全に無駄です。

また、これはアプリの構成に固有のものであり、共有システムファイルなどに保存しないでください。

28
mnemy

使用する

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

静的定数の宣言であっても、アプリケーションのどこでも絶対に使用できます!ただし、システムリソースのみの場合。

ローカルリソースの場合は そのソリューション を使用します。

76
Gangnus

メインのアプリケーションクラスを拡張し、そこにリソースにアクセスするためのユニバーサルヘルパーを提供できます。これにより、アプリケーションは呼び出し側ではなくコンテキストを提供するため、コンテキストの必要性が軽減されます。アプリケーションクラスはシングルトンスタイルであり、アプリケーションの任意の部分(サービスを含む)が実行されている間は常に使用できます。

public class MyApplication extends Application {
 protected static MyApplication instance;

 @Override
 public void onCreate() {
  super.onCreate();
  instance = this;
 }

 public static Resources getResources() {
  return instance.getResources();
 }
}

これにより、以下にアクセスできます。

MyApplication.getResources()....

これにアクセスするには、マニフェストでカスタムアプリケーションを宣言してください。カスタムアプリケーションがアプリケーションの名前空間のルートにあると仮定します。

<application
 Android:name=".MyApplication"
 ... >
14
SandWyrm

私は次のことをお勧めします:どこでもコンテキストを渡すのではなく、アクティビティクラスを、コンテキストを返すパブリック関数を持つシングルトンクラスにします。

private static ActivityMain instance;

Super.onCreate()の前にonCreate()内で初期化します。

instance = this;

次に、これらのパブリック関数をアクティビティに追加します。

/** Get singleton instance of activity **/
public static ActivityMain getInstance() {
    return instance;
}

/** Returns context of this activity **/
public static Context getContext(){
    return instance.getApplicationContext();
}

これで、任意のクラスの任意の場所で以下を使用できます。

Context context = AntiMorphActivity.getContext();
String packageName = context.getPackageName();
int id = context.getResources().getIdentifier("web_page", "raw", packageName);
1
goodies4uall

残念ながら、これを回避する現実的な方法はないと思います。私はこのようなものをレイアウトし、アクティビティコンテキストの代わりにgetApplicationContext()も渡します。

public static AppController getAppController(Context context){
    if(self == null) {
        //Create instance
        self = new AppController();
    }

    return self;
}

その後:

appController = AppController.getAppController(getApplicationContext());
1
sgarman

以下の質問に対するstackoverflowの回答は、POJOを使用してリソースへのストリームを取得する方法を示しています(パスを指定した場合)。これは、多くのリソースの中から特定のリソースを選択する必要がある場合に役立ちます。

Androidライブラリプロジェクト でコンテキスト参照なしで未加工のテキストファイルを読み取ることは可能ですか?

0
andrew pate