Android: pourquoi utiliser getBaseContext () au lieu de cela
this
souvent pour faire référence au contexte actuel. Mais, dans certains cas, pourquoi nous devons utiliser getBaseContext()
au lieu de this
. (Cela signifie que lors de l'utilisation this
remarquera une erreur).
Voici mon exemple:
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line
}
Au code ci-dessus, lorsque je change getBaseContext()
en this
recevra une erreur.
Qui peut m'expliquer, s'il vous plaît.
getApplicationContext ()
renvoie le contexte d'application de l'ensemble du cycle de vie de l'application, lorsque l'application se détruira, elle se détruira également.this
le contexte retourne le contexte actuel de l'activité, appartient à l'activité, l'activité est détruite puis elle le détruira aussi. mais dans votre cas elle fera référence à l'instanceSpinner
car nous sommes en l'utilisant dans la méthodeonItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
qui est de la classeSpinner
etSpinner
hérite de cette méthode de l'interfaceAdapterView.OnItemSelectedListener
getBaseContext()
est la méthode deContextWrapper
. EtContextWrapper
est, " Implémentation proxy de Context qui délègue simplement tous ses appels à un autre Context. Peut être sous-classé pour modifier le comportement sans changer le Context d'origine." (selon javadocs) ..
et dans votre cas: Spinner
classe n'est pas une sous-classe de Context
ou ContextWrapper
classe *
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
signifie getBaseContext()
est la méthode de ContextWrapper
et ContextWrapper
est l'implémentation proxy de Context
donc indirectement nous passons un objet de classe de contexte.
ou nous pouvons également passer 'Activity.this' parce que la classe Activity
est une sous-classe de la classe ContextWrapper
.
si vous allez avec documentation Android alors cette méthode nécessite un objet de classe Context:public static Toast makeText (Context context, int resId, int duration)
nous ne pouvons donc pas transmettre une activité ou un contexte de classe signifie this
à Toast.makeText
qui n'ont pas de sous-classe de la classe Context
ou ContextWrapper
.
Dans votre exemple, this
fait référence à OnItemSelectedListener
nouvellement créé et non à un objet contextuel. Si ce code est en activité, vous pouvez écrire YourActivity.this
Au lieu de getBaseContext()
.
OnItemSelectedListener listener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){
// this.equals(listener) == true;
// getBaseContext() here means YourActivity.this.getBaseContext()
// getBaseContext() called from outer context object (activity, application, service)
}
}
Si ce code se trouve dans l'activité MyActivity
, vous pouvez également remplacer getBaseContext()
par MyActivity.this
.
En effet, this
fait référence à l'instance OnItemSelectedListener, pas à l'activité. getBaseContext()
fait référence au contexte d'activité.
getBaseContext () fait référence à Activity.this
comme nous voulons montrer Toast en cliquant sur le bouton, nous n'utilisons jamais cela, nous utilisons Activty.this. Pour que nos toasts soient affichés jusqu'à ce que nous soyons sur la même activité. Mais si nous utilisons getApplicationContext (), notre Toast s'affichera même si nous changeons d'activité.
OnItemSelected
méthode, cela fait référence à la nouvelle instance OnItemSelectedListener
que vous avez utilisée. getBaseContext
est votre classe externe.
Si vous utilisez this
fait référence OnItemSelectedListener
. Et son Interface not Class
.si cela vous donne une erreur , Toujours utiliser si vous êtes dans l'activité YourActivityName.this
Le getBaseContext () confond parfois les nouveaux arrivants avec Android, à la place, on pourrait également utiliser ActivityName qui est l'activité actuelle dans laquelle vous travaillez. donc ActivityName.this remplacera getBaseContext ()