40 Stimmen

Android: warum muss getBaseContext() anstelle von this verwendet werden

this oft mit Bezug auf den aktuellen Kontext. Aber, in manchen Fällen, warum müssen wir verwenden getBaseContext() anstelle von this . (Das heißt, wenn Sie this wird Fehler bemerken).

Hier ist mein Beispiel:

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
    }

Im obigen Code, wenn ich getBaseContext() a this einen Fehler erhalten.

Wer kann mir das erklären, bitte?

56voto

ρяσѕρєя K Punkte 130798
  1. getApplicationContext () gibt den Anwendungskontext des gesamten Anwendungslebenszyklus zurück, wenn die Anwendung zerstört wird, dann wird sie auch zerstört.

  2. this der Kontext gibt den aktuellen Kontext der Aktivität zurück, der zur Aktivität gehört, wird die Aktivität zerstört, dann wird sie auch zerstört, aber in Ihrem Fall bezieht sie sich auf die Spinner Instanz, denn wir verwenden diese innerhalb von onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) Methode, die von Spinner Klasse und Spinner erben diese Methode von AdapterView.OnItemSelectedListener Schnittstelle

  3. getBaseContext() ist die Methode der ContextWrapper . Und ContextWrapper ist, " Proxying-Implementierung von Context, die einfach alle ihre Aufrufe an einen anderen Context delegiert. Kann unterklassifiziert werden, um das Verhalten zu ändern, ohne den ursprünglichen Context zu ändern. "(wie in den Javadocs).

und in Ihrem Fall : Spinner Klasse ist nicht Unterklasse von Context o ContextWrapper Klasse*

Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();

bedeutet getBaseContext() ist Methode der ContextWrapper y ContextWrapper ist die Proxying-Implementierung von Context Wir übergeben also indirekt ein Context Class Object.

oder wir können auch 'Activity.this' übergeben, weil Activity Klasse ist Unterklasse von ContextWrapper Klasse .

wenn Sie sich für Android-Dokumentation dann erfordert diese Methode ein Objekt der Klasse Context:
public static Toast makeText (Context context, int resId, int duration)

daher können wir keine Aktivität oder einen Klassenkontext übergeben this à Toast.makeText die weder eine Unterklasse von Context または ContextWrapper Klasse.

16voto

Sergey Glotov Punkte 19959

In Ihrem Beispiel this bezieht sich auf neu erstellte OnItemSelectedListener nicht auf ein Kontextobjekt. Wenn dieser Code in einer Aktivität enthalten ist, können Sie schreiben YourActivity.this anstelle von 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)
    }
}

9voto

louiscoquio Punkte 10399

Wenn sich dieser Code in der Aktivität MyActivity können Sie auch Folgendes ersetzen getBaseContext() von MyActivity.this .

Der Grund dafür ist this bezieht sich auf die OnItemSelectedListener-Instanz, nicht auf die Aktivität. getBaseContext() bezieht sich auf den Kontext der Aktivität.

5voto

Raz Punkte 8733

OnItemSelected Methode verweist dies auf die neue OnItemSelectedListener Instanz, die Sie verwendet haben. getBaseContext ist Ihre äußere Klasse.

4voto

sharma_kunal Punkte 2076

GetBaseContext() verweist auf Activity.this

wie wir Toast auf Klick der Schaltfläche zeigen wollen, wir nie Benutzer diese wir Activty.this verwenden. So dass unsere Toast-Anzeige, bis wir auf die gleiche Aktivität sind. Aber wenn wir getApplicationContext() verwenden, dann wird unser Toast angezeigt, auch wenn wir die Aktivität wechseln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X