Dans mon Android, j'ai une classe ImageAdapter dans laquelle je passe le contexte de l'application pour d'autres besoins.
public class ImageAdapter extends BaseAdapter {
private Context c;
public ImageAdapter(Context c) {
this.c = c;
}
...
}
Le problème est que je veux faire d'ImageAdapter un singleton pour avoir un accès facile à l'instance de cette classe à partir de toutes mes activités. Mais je ne sais pas comment passer le contexte d'application de la méthode getApplicationContext () d'une de mes activités à ImageAdapter. Y a-t-il donc une "magie" pour faire cela comme suit?
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;
}
...
}
Vous avez peut-être d'autres idées pour partager ImageAdapter pour l'une de mes activités. Je suis un débutant à Android et je suis un peu confus avec les façons de transmettre des données entre les activités.
Je serai reconnaissant pour toute aide.
Mise à jour: 06-mars-18
Utilisez l'instance MyApplication
au lieu de l'instance Context
. Application
instance est une instance de contexte singleton elle-même.
public class MyApplication extends Application {
private static MyApplication mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = this;
}
public static MyApplication getContext() {
return mContext;
}
}
Réponse précédente
Vous pouvez obtenir le contexte d'application comme ceci:
public class MyApplication extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
}
public static Context getContext() {
return mContext;
}
}
Ensuite, vous pouvez appeler le contexte d'application à partir de la méthode MyApplication.getContext()
N'oubliez pas de déclarer l'application dans votre fichier manifeste:
<application
Android:name=".MyApplication"
Android:icon="@drawable/icon"
Android:label="@string/app_name" >
Je préfère passer une instance de contexte en tant que paramètre à chaque méthode de singleton qui en a vraiment besoin
APPROCHE # 1:
Puisque vous spécifiez que ImageAdapter est un singleton, une réponse simple consiste à créer ce singleton à partir d'une classe ayant accès au contexte de l'application:
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;
}
}
APPROCHE # 2:
S'il ne s'agissait pas d'un singleton, j'utiliserais la réponse acceptée. Dans ce cas, supprimez la variable locale d'ImageAdapter, car le contexte peut toujours être obtenu à partir de MyApplication. En développant la réponse acceptée, si vous voulez une méthode locale comme commodité, définissez ImageAdapter.getContext (). Solution complète:
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();
}
}