私の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の初心者であり、アクティビティ間でデータを渡す方法に少し混乱しています。
どんな助けにも感謝します。
更新: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" >
_
私は実際にそれを必要とするシングルトンのすべてのメソッドにパラメータとしてコンテキストインスタンスを渡したい
アプローチ#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();
}
}