Schreibe Android APP



  • Vermutlich muss onClick() ausgeführt werden, bevor gezeichnet wird. Versuch mal einen asynchronen Timer zu setzen.

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                 vi = (ImageView) v;
    
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
    
                // Hier Timer setzen, der in 3 Sek. ausgeführt wird und die TableView unsichtbar macht
            }
        };
    

    https://developer.android.com/reference/java/util/Timer.html



  • wie sieht der Timer code aus ?? Kannst du den mal posten ?

    Vermutlich muss onClick() ausgeführt werden, bevor gezeichnet wird.

    Naja onClick wird ja zuerst ausgeführt. Versteh ich jetzt nicht ganz..

    Ich bezweifel ob der Timer was hilft. Da kann ich auch eine 3 sekunden for loop machen.



  • Versuch das schon selber...

    Weißt du überhaupt, was ein Timer ist? Der wird asynchron in einem Scheduler eingereiht und zu gegebener Zeit asynchron ausgeführt (kannst du selber einstellen, wann er ausgeführt wird). D. h., deine onClick()-Funktion ist bis dahin komplett ausgeführt und die Hintergrundfarbe gesetzt. Wenn der Timer abgelaufen ist, wird dann z. B. table.setVisibility(View.INVISIBLE) ausgeführt.

    https://examples.javacodegeeks.com/android/core/activity/android-timertask-example/



  • jetzt stürzt mir die ganze App ab. Ich hab den Timer jetzt eingebaut..

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                timerTask = new TimerTask() {
    
                    public void run() {
                        handler.post(new Runnable() {
                                         public void run() {
                                            table.setVisibility(View.INVISIBLE);
                                         }
    
                                     });
                    }
                };
    
                vi = (ImageView) v;
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
                timer = new Timer();
                timer.schedule(timerTask, 3000, 0); 
                player1SelectedNr = vi.getId();
            }
        };
    


  • Wenig aussagekräftig ohne Fehlermeldung, was?



  • Kann das bitte mal einer ausprobieren. Wenn man auf einen Button klickt , öffnet sich die ImageView. Klickt man auf die ImageView wird der Hintergrund 3 Sekunden blau und dann schließt sich die ImageView wieder. Danke.



  • Ibinda100 schrieb:

    Kann das bitte mal einer ausprobieren. Wenn man auf einen Button klickt , öffnet sich die ImageView. Klickt man auf die ImageView wird der Hintergrund 3 Sekunden blau und dann schließt sich die ImageView wieder. Danke.

    Ich finde die Erwartungshaltung, dass andere eure Hausaufgaben machen sollen, echt lustig.
    Vll. schreibt ihr mal welche Fehlermeldung ihr beim Timer bekommen habt. Dass das prinzipiell funktioniert, beweist ja die Beispiel-App in dem Link den ich gepostet habe...



  • Peter_Mueller schrieb:

    Ehrlich gesagt glaub ich fast dass onClick Handler im GUI Thread ausgeführt wird.

    Das ist in den meisten GUI Frameworks so. Macht normalerweise auch Sinn - GUI Events asynchron in beliebigen Threads abzuarbeiten macht alles bloss viel komplizierter.
    (Ich kenne das Android SDK nicht, aber ich würde einfach mal vermuten dass es da auch so ist.)

    Davon abgesehen möchte ich mich dem was ShadowClone geschrieben hat anschiessen. Wenn du möchtest dass jemand etwas für dich ausprobiert, dann musst du schon
    a) Zeigen dass du selbst alles mögliche versuchst den Fehler zu finden (z.B. indem du hier eine aussagekräftige Fehlerbeschreibung inklusive Fehlercodes/Exceptions/Stack-Trackes/was-auch-immer postest) und
    b) Es für den potentiellen Helfer so einfach wie möglich machen (z.B. indem du ein .ZIP mit einem fertigen Projekt verlinkst das der Ausprobierer einfach nur mehr aufmachen, bauen und starten muss).



  • würde ja gerne eine Fehlermeldung zeigen. Aber irgendwie will der Debugger nicht anspringen wenn ich die App auf mein Smartphone lade. Emulator benutz ich nicht da dann mein kompletter Computer hängt.



  • Zitat:

    Kann das bitte mal einer ausprobieren. Wenn man auf einen Button klickt , öffnet sich die ImageView. Klickt man auf die ImageView wird der Hintergrund 3 Sekunden blau und dann schließt sich die ImageView wieder. Danke.

    Für einen der Android gut kann, dürfte das auch nicht lange dauern..



  • Ciao, bin draußen.



  • ich hab das ganze Wochenende rumgemacht. Deswegen die Bitte...



  • Ibinda100 schrieb:

    ich hab das ganze Wochenende rumgemacht. Deswegen die Bitte...

    Das ist überhaupt nichts ungewöhnliches. Und wenn du so lustlos daherwerkelst, bringt es auch nichts, wenn du eine ganze Woche lang dran rumfrickelst.
    Ohne Debug-Ausgaben lässt sich kaum anständig entwickeln und Ferndiagnosen lassen sich erst recht nicht machen.
    Hausaufgaben werden hier auch nicht erledigt.
    Mach die Sachen anständig und du wirst mit einem Bruchteil deines Aufwands vorankommen. Heißt z. B. konkret: Sich nicht damit zufrieden geben, dass man keine Debug-Ausgaben bekommt, sondern das Problem beheben. Manchmal hilft auch ein Neustart von Android-Studio.



  • Falls du das (s.u.) bereits gemacht hast, und ich hab' es bloss übersehen: Sorry. Ansonsten:

    hustbaer schrieb:

    b) Es für den potentiellen Helfer so einfach wie möglich machen (z.B. indem du ein .ZIP mit einem fertigen Projekt verlinkst das der Ausprobierer einfach nur mehr aufmachen, bauen und starten muss).



  • bin schon mal vorsichtig begeistert. Wenn ich den Timer so aufrufe

    timer.schedule(timerTask, 3000, 3000); //vorher timer.schedule(timerTask, 3000,0);
    

    funktionierts schon mal. Aber wie stop ich eigentlich den Timer 🙂
    Es gibt wohl timer.cancel aber wo ruf ich das auf.
    Der Trick die periode des Timers auf Unendlich zu setzen , funktioniert natürlich auch. Aber das kostet ja unnötig Rechenzeit oder...

    Übringends hier die Timer parameter
    timer.schedule(Task,long delay, long period)

    Und das problem beim Timer ( deswegen wollte ich ja eigentlich auch Thread.sleep verwenden) ist halt dass der User dann noch woanders hinklicken kann, da der Thread ja nicht gesperrt ist.



  • Du solltest wirklich mal die API lesen. Du hättest dir viele viele Stunden gespart!

    Throws
    IllegalArgumentException if delay < 0, or delay + System.currentTimeMillis() < 0, or period <= 0

    Du hattest period auf 0 gesetzt und deswegen flog eine IllegalArgumentException.

    Hättest du weiter in der API geschaut, dann wüssest du, dass es eine überladene Methode gibt:

    schedule(TimerTask task, long delay)
    

    Folgendes müsste also funktionieren:

    timer.schedule(timerTask, 3000);
    

    Das ist wirklich eine Paradebeispiel dafür, wie man Zeit vergeuden kann, wenn man Dinge nicht richtig tut. Lieber viele Tage mit Try and Error verplempern als einmal richtig die API lesen...



  • so das funktioniert jetzt. Aber ich hab ja 4 Bilder. Damit der User während des Timers delay nicht auf ein anderes Bild klickt, möchte ich die anderen 3 invisible schalten. Kurioserweise wird zwar der background des einen Bilders neu gezeichnet, aber die anderen Bilder werden nicht invisible gemacht. Woran kann das nun wieder liegen. Wie könnte ich das lösen.

    vi = (ImageView) v;
                //hier setz ich den hintergrund des geklickten bildes auf blau
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
    
                //Hier setz ich die anderen 3 Bilder invisible
                if(vi!= imgRow1Left)
                {
                    imgRow1Left.setVisibility(View.INVISIBLE);
                }
                if(vi != imgRow1Left)
                {
                    imgRow1Right.setVisibility(View.INVISIBLE);
                }
                if(vi != imgRow1Left)
                {
                    imgRow2Left.setVisibility(View.INVISIBLE);
                }
                if(vi != imgRow1Left)
                {
                    imgRow2Right.setVisibility(View.INVISIBLE);
                }
    
                timer = new Timer();
                timer.schedule(timerTask, 3000);
    


  • Lies den Code nochmal.
    Zeile für Zeile. Ob das da steht was du meinst dass dastehen sollte. Tut es nämlich nicht. So offensichtliche Fehler musst du selbst finden.



  • Entweder du bemerkst deinen Copy & Paste Fehler und wenn du das nicht tust, dann kannst du an den entsprechenden Stellen Debuggen --> Achso, kannst du nicht, weil du das Debug-Problem noch nicht gelöst hast?

    Merke dir eins: Wenn du ein größeres Problem hast, dann deshalb, weil du gleich mehrere Fehler gemacht hast und das wird solange weitergehen, bis du die Dinge richtig anpackst.

    Wenn wir dir hier wieder alles sagen, dann stolperst du gleich im nächsten Moment über den nächsten Krümel auf den Boden, weil deine Herangehensweise schon falsch ist.



  • ah den copy paste fehler seh ich jetz auch *gg*. Aber bin mal gespannt ob es dann geht. Hatte vorher nee andere IMplementierung da ging es nicht..


Anmelden zum Antworten