33

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

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

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

4

5 に答える 5

89

使用する

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

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

ローカル リソースの場合は、そのソリューションを使用してください。

于 2012-01-06T23:05:15.053 に答える
15

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

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"
 ... >
于 2012-11-06T19:58:48.700 に答える
2

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

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);
于 2012-08-17T17:12:12.890 に答える
1

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

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

    return self;
}

その後:

appController = AppController.getAppController(getApplicationContext());
于 2011-04-07T00:40:56.180 に答える
0

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

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

于 2014-11-03T11:49:09.673 に答える