web-dev-qa-db-ja.com

非アクティビティシングルトンクラスからアプリケーションコンテキストを取得する

私のAndroidプロジェクトには、ImageAdapterクラスがあり、さらにいくつかのニーズのためにアプリコンテキストを渡します。

public class ImageAdapter extends BaseAdapter {
    private Context c;

    public ImageAdapter(Context c) {
            this.c = c;
    }
    ...
}

問題は、すべてのアクティビティからこのクラスのインスタンスに簡単にアクセスできるように、ImageAdapterをシングルトンとして作成することです。しかし、アクティビティの1つであるgetApplicationContext()メソッドからImageAdapterにアプリコンテキストを渡す方法がわかりません。次のようにそれを行うための「魔法」はありますか?

public class ImageAdapter extends BaseAdapter {

    private Context c;

    private static class Holder {
            public static final ImageAdapter IA = new ImageAdapter();
    }

    private ImageAdapter() {
            this.c = /* some magic here */.getApplicationContext();
    }

    public static ImageAdapter getInstance() {
            return Holder.IA;
    }
    ...
}

たぶん、あなたは私の活動のいずれかのためにImageAdapterを共有するためのいくつかの他のアイデアを持っています。私はAndroidの初心者であり、アクティビティ間でデータを渡す方法に少し混乱しています。

どんな助けにも感謝します。

35
Dmitry

更新:06-Mar-18

MyApplicationインスタンスの代わりにContextインスタンスを使用します。 Applicationインスタンスは、シングルトンコンテキストインスタンスそのものです。

_public class MyApplication extends Application {

    private static MyApplication mContext;

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

    public static MyApplication getContext() {
        return mContext;
    }
}
_

前の回答

次のようなアプリケーションコンテキストを取得できます。

_public class MyApplication extends Application {

    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
    }

    public static Context getContext() {
        return mContext;
    }
}
_

次に、メソッドMyApplication.getContext()からアプリケーションコンテキストを呼び出すことができます

マニフェストファイルでアプリケーションを宣言することを忘れないでください。

_<application
    Android:name=".MyApplication"
    Android:icon="@drawable/icon"
    Android:label="@string/app_name" >
_
84
mohammed momn

私は実際にそれを必要とするシングルトンのすべてのメソッドにパラメータとしてコンテキストインスタンスを渡したい

7
Micik

アプローチ#1:

ImageAdapterがシングルトンであることを指定しているため、1つの簡単な答えは、アプリコンテキストにアクセスできるクラスからそのシングルトンを作成することです。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ImageAdapter.createIt(this);
    }
}

public class ImageAdapter extends BaseAdapter {
    private static ImageAdapter it;
    // Get the singleton.
    public static ImageAdapter getIt() {
        return it;
    }
    // Call this once, to create the singleton.
    public static void createIt(Context context) {
        it = new ImageAdapter(context);
    }

    private final Context c;
    private ImageAdapter(Context context) {
        c = context;
    }
}

アプローチ#2:

それがシングルトンでなければ、受け入れられた答えを使用します。その場合、コンテキストは常にMyApplicationから取得できるため、ImageAdapterからローカル変数を削除します。受け入れられた答えを拡張して、ローカルメソッドを便利にする場合は、ImageAdapter.getContext()を定義します。完全なソリューション:

public class MyApplication extends Application {
    private static Context appContext;
    public static Context getContext() {
        return appContext;
    }

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

public class ImageAdapter extends BaseAdapter {
    public ImageAdapter() {
    }

    // [Optional] Call this whenever you want the app context.
    private Context getContext() {
        return MyApplication.getContext();
    }
}
2
ToolmakerSteve