Hallo erstmal & Verständnisfrage OnClickListener

  • Hallo,


    ich bin noch grüner wie grün in Sachen Android-Programmierung und habe gestern angefangen mich einzulesen und vor Allem einzurichten.


    Meine Java-Kenntnisse übrigens sind durchwachsen. Größtenteils komme ich gut zurecht, es gibt aber Facetten von Java, von denen ich bisher noch nie wirklich Gebrauch gemacht habe. im GUI-Bereich habe ich auch keine Erfahrung.


    Doch zurück zu Android. Nach einem ganz groben Überblick durch feie Infos dient mir zum Lernen nun "Android 4 Apps entwickeln mit dem Android SDK" von Thomas Künneth (für weitere Empfehlungen bin ich offen). Dort bin ich bei dem Anwenden des OnClickListeners angekommen, allerdings tun sich bei mir Fragezeichnen auf, was dort genau geschieht. Zunächst ein Codeschnipsel:



    weiter_fertig ist übrigens eine Referenz auf ein Objekt vom Typ Button.


    Soweit ich unabhängig von dem Code das Prinzip verstehe ist OnClickListener erstmal nur ein Interface, dass besagt, dass die
    Methode "onClick (View v)" implementiert werden muss.


    Meine eigene logische Schlussfolgerung wäre, dass ich also zunächst eine Klasse, sagen wir namens "ListenMe" erstelle, die onClickListener implementiert. Darin kann ich dann durch überschreiben von onClick(View v) bestimmen, was beim Click geschehen soll.
    Das Ganze würde ich dann per

    Code
    weiter_fertig.setOnClickListener(new ListenMe())


    dem Button-Objekt zuweisen.


    Nun ist es aber nicht so, wie ich denke, sondern es steht dieses für mich seltsam erscheinende Code-Konstrukt im Raum.
    Dabei wird über "new OnClickListener()" eine Instanz des Interfaces erzeugt? Das ist doch Quatsch - geht doch meines Wissens nach gar nicht? Auch kenne ich die Schreibweise mit dem dahinterstehenden Block nicht.
    Was will mir also dieses Stückchen Code genau sagen ?


    Hoffe jemand kann Licht in mein Dunkel bringen.


    Vielen Dank
    Chris303

  • Moin!


    "Android 4 Apps entwickeln mit dem Android SDK" von Thomas Künneth


    Hab die Version für Android 3 hier und muss sagen, dass ich Herrn Künneths Buch für Einsteiger nicht so optimal finde.
    Aber egal. ;)




    Boah, diese Benamsung.
    Und erklärt hat er vermutlich auch nix...


    Soweit ich unabhängig von dem Code das Prinzip verstehe ist OnClickListener erstmal nur ein Interface, dass besagt, dass die Methode "onClick (View v)" implementiert werden muss.


    Soweit richtig.


    Meine eigene logische Schlussfolgerung wäre, dass ich also zunächst eine Klasse, sagen wir namens "ListenMe" erstelle, die onClickListener implementiert. Darin kann ich dann durch überschreiben von onClick(View v) bestimmen, was beim Click geschehen soll.


    Das könntest du tun, wäre aber etwas aufwendig. Schließlich müsstest du dann schauen, von welcher Activity das View gerade gehosted wird und entsprechend reagieren.

    Das Ganze würde ich dann per

    Code
    weiter_fertig.setOnClickListener(new ListenMe())


    dem Button-Objekt zuweisen.


    Zum Beispiel, ja.


    Nun ist es aber nicht so, wie ich denke, sondern es steht dieses für mich seltsam erscheinende Code-Konstrukt im Raum.
    Dabei wird über "new OnClickListener()" eine Instanz des Interfaces erzeugt? Das ist doch Quatsch - geht doch meines Wissens nach gar nicht? Auch kenne ich die Schreibweise mit dem dahinterstehenden Block nicht.
    Was will mir also dieses Stückchen Code genau sagen ?


    Doch, genau das geht und nein, das ist kein Quatsch.


    Ein Interface ist in Java so etwas wie eine abstrakte Klasse. Von jeder Klasse lässt sich auch eine Instanz erzeugen.
    Du sagst also im weiteren Sinne: "Java Runtime, erstelle mir ein Objekt, das das Interface OnClickListener bedient und die Methode onClick(View) wie folgt implementiert."


    Du gibst diesem Button in diesem Kontext eine spezifische Instanz zum abstrakten Interface View.OnClickListener mit einer spezifischen Implementierung der Methode onClick(View v) mit.
    Statt also 17 ListenMe Klassen mit ihren jeweiligen Instanzen hast du nur 17 'Inline'-Instanzen in deinem Code.


    Bei einem derart simplen Interface ist es ziemlich oft so, dass die Anpassungen so geschehen. (Es werden selten zwei Button denselben OnClickListener verwenden, also lohnt sich eine Ableitung der Activity von OnClickListener mit einer eigenen Implementierung der Instanzmethode onClick(View) zum Einhängen nicht.)


    Bei komplexeren Dingen kannst du so beispielsweise eine eigene Subklasse mit vordefinierten Informationen erstellen und nur die immer anzupassende Methode an der Stelle implementieren, an der du sie brauchst.


    Hoffe jemand kann Licht in mein Dunkel bringen.


    Ich hoffe, ich konnte helfen. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo,


    vielen, vielen Dank für die erhellenden Worte.


    Also habe ich im Prinzip gar nicht so viel Missverstanden, diese Schreibweise ist mir nur alles Andere als geläufig. Werde mich da nochmal schlau machen.
    Und ja, über die Namensgebung musste ich auch schmunzeln .. :)


    Es ärgert mich tatsächlich ein wenig, dass das nicht wirklich mal erklärt wurde - wenn mir sowas noch öfter begegnet werde ich mich dann wohl noch mal nach Alternativen zum Lernen umsehen müssen.


    Grüße
    Chris303

  • Die Schreibweise kenne ich so noch aus JavaScript Zeiten.
    Und so ungewöhnlich finde ich sie nicht.
    Vergleiche:


    und


    Der Unterschied ist gering. :)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!