Was ist this?

  • Antworten:1
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 602

23.08.2019, 21:29:42 via Website

Hallo zusammen

Vielleicht kann mir jemand, in einfachen Worten, erklären was this ist.
Nun wie kommt diese Frage zustande. In meinem Projekt setze ich ein Spinner ein. Der funktioniert auch. Doch beim Initialisieren derselben bin ich auf diese Frage gestossen.

So funktioniert es

spi_zone.setOnItemSelectedListener(this);

Ich habe folgendes gemacht:

private Context ctx;
ctx = getApplicationContext();

Wenn ich nun folgendes mache funktioniert es nicht mehr:

spi_zone.setOnItemSelectedListener(ctx);

Warum und wo ist der Unterschied von ctx zu this?

Gruss Renato

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.08.2019, 22:02:31 via Website

Hallo Renato,

du darfst nicht 2 unterschiedliche Konzepte durcheinanderwerfen.

In Activities kann this ein Context sein, weil jede Activity von Context erbt.
Aber andersrum gilt das nicht, du kannst nicht einen belibigen Kontext in eine Activity umwandeln.
Zudem solltest du im Hinterkopf behalten, dass der ApplicationContext nicht das selbe wie der Context in "this" oder equivalent in getContext() ist.

Das Schlüsselwort "this" bezieht sich immer auf die akutelle Klasseninstanz, in dem Fall deine Activty.

Aber machen wir das etwas einfacher:
Stell dir vor du hast eine Klasse Haus und diese initialisiert du mit einer Person.
also der Constructor Haus(Person p)
Dann hast du so ein Konstrukt:

class Person{
private String vorname:
private String nachname;
private Haus house;
//getter und setter implizit.

public void buildHouse(){ //Erstelle neues Haus
 this.house = new Haus(this);

//das erste this gibt an, dass sich die variable in der aktuellen Klasse befindet und das this im Parameter übergibt die aktuelle Instanz (konkrete Person) an das Hausobjekt.
}

}

Aber das sind OOP Grundlagen, die kann ich hier nicht noch detallierter ausführen.

In deinem Fall hast du ein Listener für ItemSelected. Ein Listener ist ein Interface und so will der übergebenen Parameter eine implementierung für dieses Interface übergeben haben.
Du hast aber keine extra implementierung erstellt, sondern bei deiner Activity gesagt "implements OnSelectedItemListener" und den Listener in der Acitivty definiert.
Damit hast du deine aktuelle Klasse "this" um diesen listener erweitert und die Activity implementiert dieses Interface.
Somit kannst du this als Parameter übergeben, da deine Activity die passenden voraussetzungen erfüllt.
Ein Context implementiert keinen Listener, darum kannst du diesen auch nicht übergeben.

Aber hast du dir mal angeschaut, was die Methode überhaupt als Parameter akzeptiert?
Dann wäre dir schnell aufgefallen, dass der Paramerer kein Context sein kann.

Nur weil du an anderen Stellen this als alternative zum Context einsetzen kannst, heißt das nicht, dass du nun den Context anstelle von This oder einer konkreten Implementierung des Interface nutzen kannst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Robbiani Renato
Kommentieren