new Java Class / Seekbar / setonseekbarchangelistener

  • Hallo bräuchte wieder mal eure Hilfe.
    Bin langsam echt am verzweifeln.
    Was ist mein Wunsch.
    Ich habe eine 2 Java Class (= mit file new Java Class) in dieser soll SetOnSeekBarChangeListener aufgerufen werden.


    Da hängt es nun aber
    MainActivity

    Code
    LedAmicus led = new LedAmicus(this);
     led.ALBackSpinTop.add(0, seekbar1BackSpinTop);  //seekbar1BackSpinTop = Seekbar 
     // led.flag = 0;
     led.ALBackSpinTop.get(0).setOnSeekBarChangeListener(new LedAmicus(this));


    Hier nun die LedAmicus Java Class. Wenn ich den Debuger Starte hat led.ALBackSpinTop.get(0)
    noch einen inhalt. Wenn ich allerdings dann Auf die Seekbar klicke kommt die Fehlermeldung das led.ALBackSpinTop.get(0)

    nach dem klick auf die Seekbar > ALBackSpinTop >size = 0; > das gibt natürlich dann einen Fehler.


    Was ist da mein Fehler ?
    Warscheinlich habe ich da einen falschen Ansatz bzw. mir fehlt da noch einiges an Erfahrung.
    Gruß
    herrm_no


  • Hey, danke für deine Antwort
    das dies der Grund ist hatte ich mir irgendwie schon gedacht.


    Aber welchen Weg soll ich denn dann gehen um eine bestimmte "seekbar" / onSeekBarChangeListener einer Class zu übergeben.
    Wie würdest du denn das machen. Ich will ja eine "Class" schreiben der ich dann verschiedene eigenschaften + verschiedene "seekbars" (changeListeners) übergebe.


    Gruß

  • Ich glaub ich stell die Frage jetzt mal ein bisschen anders, vielleicht kannst du mir dabei helfen.
    Du hast mir ja schon mal bei einem anderen Thema wo es auch um fast das gleiche gegangen ist geholfen.
    Dabei war die neue Class "ArrayListBackSpinTop" /zeile 30 innerhalb der MainActivity Class.
    Diese wird dann aufgerufen durch "seekbar1BackSpinTop.setOnSeekBarChangeListener(new ArrayListBackSpinTop(0));" = letzte Zeile.
    Das funktioniert ja recht gut.
    Ich wollte nun einfach nur erreichen, das ich mit File/New Class genau den Inhalt dieser Class in eine neue File/new Class kopiere/verschiebe und dann in der MainActivity die neue Klasse aufrufe (so wie letzte Zeile). Ich hätte erwartet das dies keinen Unterschied macht. Aber da hab ich wohl falsch gedacht.
    Was mach ich da verkehrt bzw. wie geht man da genau vor.
    Gruß

  • Hey, ich kann dir nicht ganz volgen.
    Was meisnst du mit "Ich wollte nun einfach nur erreichen, das ich mit File/New Class genau den Inhalt dieser Class in eine neue File/new Class kopiere/verschiebe ..." .
    Wo machst Du das?
    Wo wie und warum willst du eine neue Klasse übergeben verstehe ich nicht.



    Bei dem Beispiel mit der inneren Klasse deffinirst du die ArryListe Global im KlassenRumpf der MainActivity somit ist sie auch von der inneren Klasse erreichbar.
    Glaube du hast da einen Denkfehler.
    In dem alten Beispiel ist es so gewesen das du mehrere Seekbars hast, und nicht für jede einen Klicklistner schreiben wolltest. Deshalb die innere Klasse. Bei der Zeile 74 " seekbar1BackSpinTop.setOnSeekBarChangeListener(new ArrayListBackSpinTop(0));"
    wird eine neue Instanz der Klasse erstellt. Jedesmal wenn du eine andere Seekbar die Klasse mit new übergiebst wird wieder eine neue Instanz erstellt. Die eine weis von der anderen nichts. Deshalb Übergeb ich den Int wert x um in der Klasse die seekbars auseinander zu halten. Ich habe dir auch geschrieben das du dich um die Fallunterscheidung noch kümmern must. z.B. mit Switch
    Case .


    Hoffe es ist jetzt etwas Klarer.
    Das ist halt Objektorientierte Programmierung.


    Ps. wenn du die ArryListe in deiner Klicklistner Klasse brauchst dann erstelle sie "public static " in der MainAtivity und in der Listner Klasse greifst du mit "MainActivity.ALBackSpinTop" darauf zu.

  • Also danke erst mal für all deine super schnellen und guten Antworten.
    Jetzt nun aber hoffentlich die letzte.
    Ich hab es jetzt so gemacht wie du es beschrieben hast, ich habe die Variable nun das Array als static definiert und es funktioiert.
    jetzt aber noch eine Frage.
    Ich will nun nicht ein Array sondern nur einen Integer Wert von der MainClass auf die Amicus Setup Class übertragen.
    Das funktioniert auch erst mal (beim ersten durchlauf wenn ich das Programm debugge). Jedoch wenn ich dann die Seekbar berühre ist die Variable wieder Null.
    (das ist ein neu aufgesetztes Projekt, nur um diese Funktion zu testen)
    Mit der ArrayList verstehe ich es nun ja hoffentlich (wegen new ArrayList), aber warum passiert das bei dem Integer "ColorGreen" auch.
    Das ist doch nur eine normale Variable und nichts mit "new"
    Wie löst man denn das korrekt.
    Bitte im Code jetzt nicht wundern (besonders der Kommentar), ich habe mehrere veschiedene Dinge ausprobiert. z.B. mit getter und setter oder direkt Zuweisung

    Code
    myS.ColorRed = 2122222;
    myS.setColorGreen(1111111);

    Funktioniert scheinbar beides. Das Ergebnis ist aber zum Schluß genau das gleiche.



    Feher entsteht hier in dem Fall durch die Zeile 88 /Class AmicusSetup
    Variable ColorGreen ist da wieder Null
    Gruß



  • Hey,
    warum erstellst du eine Instaz von der Klasse "AmicusSetup myS = new AmicusSetup(this);" in der MainActivity?
    Das ist eigentlich sinnlos. Wenn du damit meinst auf die Variablen den Litner zu zugreifen irrst du dich. Die klasse ist nur als Litner gedacht und mehr nicht . Wenn du Variablen in der Klasse setzen willst Must du die dem Kostucktor bei der Instanz ezeugung also beim erstellen des Objektes mitgeben. Natürlich den Konstuktor in der Klasse anpassen. Die Instanz "myS" ist nicht die gleiche die als Listner benutz wird. Jede erstellt Instanz hat ihern eigenen Speicherbereich. Mit der Zeile " mySeek.setOnSeekBarChangeListener(new AmicusSetup(this));" erstellst du auch eine Instanz von der Klasse die auch in einer Variablen gespeichert wird die du nur nicht siehst. Die sind nicht gleich somit auch nicht der Speicherberich.



    Auch das du wieder eine neue Liste in der Lisner Klasse erstellt ist fallsch . Du hast doch eine Statische Liste in der Main Klasse . die kannst du im gesamten Projekt benutzen und brauchst keine neue . Auch die int variablen werden immer wieder neu erstellt .
    Der Vorteil einer staischen Variable ist das du keine Instanz benötigst.


    Int Variablen brauchen kein "new" denn es sind primitive Variablen es wird aber immer beim Deffiniren dieser ein neuer Speicherbereich zugeordnet. Und bei jedem neu Deffinieren ein neuer Bereich.


    Klassen sind Objekte und die müssen mit dem Operator "new" erstellt werden.


    Wenn du die Flag und Color Variablen brauchst must du die im Konstrucktor Übergeben und dort in Globale Variablen Speichern.
    Soll das Dynamisch sein würde ich auch ein feld oder liste dafür nehmen und die wieder static machen.


    Wenn du unbedingt zwischendurch auf die Instanz der Listnerklasse zugreifen willst dann must du das in der Main in etwa so machen.


    AmicusSetup listner1 = new AmicusSetup(this);
    mySeek.setOnSeekBarChangeListener(listner1);
    Über listner1 hast du zugriff auf den Klicklistner.
    Natürlich für jede Seekbar eine Andere Variable .






    Tipp : Variablen fangen mit kleinen Buchstaben an.

  • Zu dieser Zeile " Ich will nun nicht ein Array sondern nur einen Integer Wert von der MainClass auf die Amicus Setup Class übertragen."


    Du willst nicht die werte übertragen sondern, du willst auf die Variablen in der Kalsse zugreifen das ist ein unterschied.
    Ein zugriff wird Über eine Objekt Variable die eine Instanz der Klasse gespeichert hat gemacht. Die hast du aber nicht hast.
    in derZeile "mySeek.setOnSeekBarChangeListener(new AmicusSetup(this));" wird zwar eine Instanz erzeugt und sofort an die seekbar Übergeben nur du hast sie nicht. wie gesagt wenn du die braucht weil du getter und setten benutzen möchtest must du die vorher eine Variable von der erstellen und diese der Seekbar mit geben.


    Schaue dir das Prinzip der Objektorientierten Programmierung noch mal an das scheinst du noch nicht richtig verstanden zu haben.

  • Wie Immer vielen vielne Dank für deine Antworten / Hilfe


    Ja du hast recht, so ganz hab ich die Objektorientierte Programmierung in Java noch nicht richtig verstanden.
    Ich komme von VisualBasic und da hab ich es eigentlich schon kapiert (Bin aber ja nur HobbyProgrammierer)
    Werd mir das aber jetzt doch noch genauer in Büchern und Internet durchlesen. (Hab aber schon Stunden über Stunden in Büchern und Internet gesucht, gelesen und gelernt - meine damit, daß ich nicht faul war !!).



    Ich hab aber jetzt eine Lösung gefunden
    Die Änderung der Zeile 15 auf 16 hat scheinbar die Lösung gebracht.
    Will mal hoffen, das dies nicht ein weiteres Problem ergiebt.


  • Ich selbst bin auch nur Hobby Programmierer habe in der Richtung auch keine Schule oder lehgang gemacht.
    Komme über etwas Basic Z80 , Pc Assembler C , C++ , zu Java auf Android.
    Visual Basic ist auch Objektorientiert nur ist da die Gui anders und es giebt das Prinzip der Listner glaube ich nicht. Das dir etwas schwer fällt . Solte nur ein Rat sein.


    Ps. Wenn man ein Problem löst und dabei den Zusammenhang versteht lernt man am meisten meine ich.

  • Hallo Jogimuc


    das was ich geschieben habe sollte in keinster Weise eine Kritik an dich sein !!!
    Bin auch erst seit etwa 5 Wochen dabei Java und Android zu lernen
    Ich habe auch überhaupt nichts schief von dir genommen.
    Das sollte eigentlich nur von mir eine Info an die sein, damit du siehst, dass ich nicht alle 5 Minuten nur Probleme gelöst haben möchte, sondern schon erst versuche sie selbst irgendwie zu lösen.


    Bin auch echt froh, dass es so jemanden wich dich gibt der Anfängern unter die Arme greift.
    Besonders deine Geschwindigkeit in den Antowrten ist schon bemerkenswert.
    Gruß
    herrm_no


    :thumbup:

Jetzt mitmachen!

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