web-dev-qa-db-fra.com

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.

31
hqt
  1. 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.

  2. 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'instance Spinner car nous sommes en l'utilisant dans la méthode onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) qui est de la classe Spinner et Spinner hérite de cette méthode de l'interface AdapterView.OnItemSelectedListener

  3. getBaseContext() est la méthode de ContextWrapper. Et ContextWrapper 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.

48
ρяσѕρєя K

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)
    }
}
14
Sergey Glotov

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é.

9
louiscoquio

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é.

4
sharma_kunal

OnItemSelected méthode, cela fait référence à la nouvelle instance OnItemSelectedListener que vous avez utilisée. getBaseContext est votre classe externe.

4
Raz

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

3
Samir Mangroliya

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 ()

3
EdemOne