Je ne comprends pas vraiment comment tout cela fonctionne vraiment, donc si j'ai une classe A
qui a besoin du contexte d'une classe B
qui étend Activity
, comment puis-je obtenir ce contexte?
Je cherche un moyen plus efficace que de donner le contexte comme paramètre au constructeur de classe A
. Par exemple, si la classe A
aura des millions d'instances, nous finirons par avoir des millions de pointeurs redondants sur Context
, alors que nous devrions pouvoir en avoir une seule et une fonction de lecture ...
Vous pouvez utiliser Application
class (classe publique dans le package Android.application), à savoir:
Classe de base pour ceux qui ont besoin de maintenir l'état global de l'application. Vous pouvez fournir votre propre implémentation en spécifiant son nom dans la balise de votre AndroidManifest.xml, ce qui provoquera l'instanciation de cette classe lors de la création du processus de votre application/package.
Pour utiliser cette classe, faites:
public class App extends Application {
private static Context mContext;
public static Context getContext() {
return mContext;
}
public static void setContext(Context mContext) {
this.mContext = mContext;
}
...
}
Dans votre manifeste:
<application
Android:icon="..."
Android:label="..."
Android:name="com.example.yourmainpackagename.App" >
class that extends Application ^^^
Dans l'activité B:
public class B extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sampleactivitylayout);
App.setContext(this);
...
}
...
}
En classe A:
Context c = App.getContext();
Note:
Il n’est normalement pas nécessaire de sous-classer Application. Dans la plupart des cas, les singletons statiques peuvent fournir les mêmes fonctionnalités de manière plus modulaire. Si votre singleton a besoin d'un contexte global (par exemple, pour enregistrer des récepteurs de diffusion), vous pouvez attribuer à la fonction de récupération un contexte utilisant en interne Context.getApplicationContext () lors de la première construction du singleton.
Ok, je vais donner un petit exemple sur la façon de faire ce que vous demandez
public class ClassB extends Activity
{
ClassA A1 = new ClassA(this); // for activity context
ClassA A2 = new ClassA(getApplicationContext()); // for application context.
}
Le moyen le plus simple et le plus simple d’obtenir le contexte de l’activité consiste à mettre .this
après le nom de l’activité. Par exemple: Si le nom de votre activité est SecondActivity
, son contexte sera SecondActivity.this
vous passez le contexte à la classe B dans son constructeur et assurez-vous que vous transmettez getApplicationContext () au lieu d'un activityContext ()
Vous pouvez créer un constructeur en utilisant le paramètre Context de la classe A, puis vous pouvez utiliser ce contexte.
Contexte c;
A (contexte de contexte) {this.c = contexte}
À partir de l'activité B, vous créez un objet de classe A à l'aide de ce constructeur et en transmettant getApplicationContext ().
À Kotlin seront:
activity?.applicationContext?.let {
it//<- you context
}
Si vous avez besoin du contexte de A en B, vous devez le transmettre à B, et vous pouvez le faire en transmettant l'activité A comme paramètre comme suggéré par d'autres. Je ne vois pas trop le problème des nombreux cas où A aurait ses propres indicateurs, mais je ne suis pas sûr que cela constituerait un tel surcoût.
Mais si tel est le problème, une possibilité est de garder le pointeur sur A comme une sorte de global, comparable à la classe Application
, comme l'a suggéré @hasanghaforian. En fait, en fonction de la raison pour laquelle vous avez besoin du contexte, vous pouvez même utiliser le contexte de la variable Application
.
Je suggérerais de lire cet article à propos du contexte pour mieux le comprendre.