Frage zu OnClickListener. Verständnisproblem

mrkennedie89

Mitglied
Hallo,

ich bin gerade dabei mich etwas in die Materie der App-Entwicklung mit Android Studio und Java einzuarbeiten. Leider bereitet mir ein kleiner Codeschnipsel
schon Sorgen, da ich nicht wirklich durchsteige warum es so funktioniert. Es geht um folgendes Beispiel, bei dem mit OnClick der Zustand eines Buttons
verändert werden soll:

Java:
protected void onCreate(Bundle savedInstanceState) {
    ...
 
     View.OnClickListener onButtonClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
               ...
        }
    };
 
   
    Button button = (Button) findViewById(R.id.button_activity_main);
 
    // Registrieren der OnClickListener-Instanz für den Button
    button.setOnClickListener(onButtonClickListener);
 
    ...
}

Soweit habe ich folgendes Verstanden: Es gibt eine Superklasse View in der das Interface OnClickListener angelegt ist mit der
nicht implementierten Methode onClick();
Um Code-Zeilen zu sparen wird OnClickListener on the fly im Programmablauf als anonyme Klasse eingebunden und die
Methode onClick direkt implementiert.
Das Buttonobjekt wird mit Hilfe der findViewbyID() Methode aufgerufen, weil die ID in der Klasse R gespeichert ist. So weiß die Activity Java
um welches Objekt aus der View es sich handelt.

Nun zur letzten Zeile: Warum wird das erzeugte Objekt von der Anyonymen Klasse OnClicklistener als Übergabeparameter
der Methode setOnClickListener übergben? Ist im Objekt onButtonClickListener die Methode onClick gespeichert?
Wie kann ich den gedanklichen Strich vom Button ziehen? Soweit ich weiß ist ein Button ja eine Unterklasse von TextView und
TextView wiederum von View?

Ich wäre für Hilfe dankbar.
 

mihe7

Top Contributor
Soweit hast Du das schon alles richtig verstanden (die Geschichte mit findViewById() ist etwas seltsam geschrieben, aber das sind jetzt Details, die an der Stelle nicht wirklich interessieren).

Es gibt also ein Interface View.OnClickListener. Dein onButtonClickListener ist eine Variable, die eine Referenz auf ein Objekt hält, das dieses Interface implementiert.

Jetzt zur Frage:
Warum wird das erzeugte Objekt von der Anyonymen Klasse OnClicklistener als Übergabeparameter
der Methode setOnClickListener übergben?
Weil ansonsten niemand weiß, was passieren soll, wenn auf die View geklickt wird.

Ist im Objekt onButtonClickListener die Methode onClick gespeichert?
Die Methode ist in der anonymen Klasse definiert, von der das Objekt (auf das onButtonClickListener verweist) eine Instanz ist.

Nachtrag:
Wie kann ich den gedanklichen Strich vom Button ziehen? Soweit ich weiß ist ein Button ja eine Unterklasse von TextView und
TextView wiederum von View?
Richtig, das siehst Du auch, wenn Du die Dokumentation aufschlägst. Button ist Subklasse von TextView, TextView ist Subklasse von View und View ist Subklasse von Object (wie alle Klassen).
 

mrkennedie89

Mitglied
Soweit hast Du das schon alles richtig verstanden (die Geschichte mit findViewById() ist etwas seltsam geschrieben, aber das sind jetzt Details, die an der Stelle nicht wirklich interessieren).

Es gibt also ein Interface View.OnClickListener. Dein onButtonClickListener ist eine Variable, die eine Referenz auf ein Objekt hält, das dieses Interface implementiert.

Jetzt zur Frage:

Weil ansonsten niemand weiß, was passieren soll, wenn auf die View geklickt wird.


Die Methode ist in der anonymen Klasse definiert, von der das Objekt (auf das onButtonClickListener verweist) eine Instanz ist.

Nachtrag:

Richtig, das siehst Du auch, wenn Du die Dokumentation aufschlägst. Button ist Subklasse von TextView, TextView ist Subklasse von View und View ist Subklasse von Object (wie alle Klassen).
Hi, danke für die Antwort. Ich verstehe aber immer noch nicht ganz was set.OnClickListener genau tut, abgesehen davon, dass er dem Button den Listener zur Verfügung stellt und, wenn er gedrückt wird, die Vorgaben des Interfaces im Programm durchlaufen lässt.
Was ich nicht verstehe ist das Prinzip dahinter. Ich habe bisher nur in Java die Grundlagen erlernt.

Wie kann ich mich diesem Prinzip nähern, dass ich es bspw. in Javacode nachbauen kann? Bzw. was sollte ich mir an Themen anschauen evtl. auch in anderen Sprachen um es vollständig erfassen zu können? Mir bereitet es irgendwie große Sorgen, wenn ich den Code einfach nur auswendig lerne aber nicht wirklich verstehe was dort in Android Studio passiert. Leider finde ich auch keine genauen Erklärungen.
 

mrkennedie89

Mitglied
Im Guide von Android steht zur Methode setOnClickListener "Register a callback to be invoked when this view is clicked.".
Was genau bedeutet der Callback hier?
 

LimDul

Top Contributor
Android (und viele andere GUI-Frameworks) sind Ereignisgesteuert. Das ist auf den ersten Blick etwas anders, als ein normaler Programmablauf. Wenn wir mal ein simples Java Programm ansehen

Java:
public void main(String args[]) {
macheWas();
macheNochWas();
}
Dann wird das der Reihe nach ausgeführt. Erst der Code aus macheWas() und dann der Code aus macheNochWas().

Alles sequentiel hintereinander.

Das ist für eine GUI natürlich blöd. Den da gibt es ja nicht einen Ablauf. Der hängt ganz stark davon ab, wie der Benutzer mit der GUI interagiert. Klick auf den einen Button, soll vielleicht X passieren. Klickt er auf einen anderen Button soll y passieren.

Das heißt, du kannst nicht einfach ein Programm schreiben, was von oben nach unten abgearbeitet wird. Stattdessen muss du definieren, was passieren soll, wenn gewisse Ereignisse eintreten. Das heißt, du definierst "Wenn der User auf den Button clickt soll das und das passieren". Und genau das ist der ClickListener. Das heißt, du sagst, wenn der Benutzer auf den Button clickt, soll folgende Funktion aufgerufen werden. Diese Funktion nennt sich Callback. Weil du rufst die Funktion nicht auf, sondern sagst (hier Android) wenn das Ereignis "User hat auf Button geklickt" auftritt, dann rufe mich an dieser Funktion zurück.

Klarer geworden?



Technisch ist das so, dass irgendwo von Android gesteuert folgenden Code gibt (In Wirklichkeit deutlich kompexer):

Java:
while (!benutzerHatAnwendungBeendet) {
  if (benutzerHatIrgendwoGeklikct()) {
    KlickbaresObjekt myObject = findeGeklicktesObjekt();
    if (myObject.hasClickListener()) {
      myObject.getClicklistener().fireEvent();
    }
  }
}
 

Jw456

Top Contributor
Callback Rückruf von System.

Du Teilst dem System Android mit welche Methode Code es ausführen soll wenn das System einen Klick erkennt.

Ein listener ist eine callback Methode.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
xXSkyWalkerXx1 Android Bluetooth LE - Frage zur Funktionalität Android & Cross-Platform Mobile Apps 26
M Frage zu setContentDescription Android & Cross-Platform Mobile Apps 2
G Google Play Store Design Frage Android & Cross-Platform Mobile Apps 2
Augenblau Android Frage zu den unterschiedlichen Menüarten Android & Cross-Platform Mobile Apps 0
S AsyncTask und doInBackground Frage Android & Cross-Platform Mobile Apps 2
L Android Generelle Frage zur Spieleprogrammierung unter Android Android & Cross-Platform Mobile Apps 2
H Frage bei erstellen eines Projectes Android & Cross-Platform Mobile Apps 3
G Wissen frage - wo am besten Speichern. Android & Cross-Platform Mobile Apps 1
B Android Verständnis frage zu Threads//AsyncTasks Android & Cross-Platform Mobile Apps 10
J Android ganz kurze frage Android & Cross-Platform Mobile Apps 2
K Android Frage zu Themes/Styles Android & Cross-Platform Mobile Apps 5
kaoZ Android Allgemeine Frage zum Händeln mehrerer EditTextfelder Android & Cross-Platform Mobile Apps 25
R Frage zu Widgets Android & Cross-Platform Mobile Apps 2
B Kurze Frage zu Play Store? Android & Cross-Platform Mobile Apps 2
U Android Kleine ImageButton Frage Android & Cross-Platform Mobile Apps 2
U Android Frage zu eigenen Adaptern Android & Cross-Platform Mobile Apps 2
U Android ListView Frage Android & Cross-Platform Mobile Apps 6
M Frage zu Java Programm für Windows Mobile 6.5 Android & Cross-Platform Mobile Apps 2
P Allgemeine frage bzg. Android Android & Cross-Platform Mobile Apps 10
H FileConnection: Frage nach Dateisystem-Zugriff unterdrücken Android & Cross-Platform Mobile Apps 5
W Wie kann man OnClicklistener und OnCheckedChangeListener zusammen ausführen Android & Cross-Platform Mobile Apps 18
S onClickListener auf Buttons die im Code erzeugt wurden setzen. Android & Cross-Platform Mobile Apps 8
MaxG. Android Absturz bei Aufruf von onClickListener() Android & Cross-Platform Mobile Apps 8
G OnCLICKListener - OnTOUCHListener Android & Cross-Platform Mobile Apps 2
D Android OnClickListener funktioniert auf LinearLayout nicht Android & Cross-Platform Mobile Apps 6
L Bitmap mit OnClickListener Android & Cross-Platform Mobile Apps 8
H Android TranslateAnimation und OnClickListener Android & Cross-Platform Mobile Apps 2
N Android HTTPClient vs HttpUrlConnection vs Socket Verständnisproblem Android & Cross-Platform Mobile Apps 4

Ähnliche Java Themen

Neue Themen


Oben