Schreibe Android APP



  • du musst einfach das Action.Down Event abfragen



  • Wenn auf die View geklickt wird, dann soll sich die Background Farbe ändern. Leider macht sie das erst wenn der komplette Handler fertig ist, also das pausieren in der onClickListener Methode hilft mir gar nix. Wie kann man das machen ?????

    // Create an anonymous implementation of OnClickListener
        private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                ImageView vi = (ImageView) v;
                //hier setze ich die neue Farbe der View
                vi.setBackgroundColor(Color.argb(255,163,237,250));
                player1SelectedNr = vi.getId();
                //hier pausiere ich für 1 Sekunde
                SystemClock.sleep(1000);
    
                table.setVisibility(View.INVISIBLE);
            }
        };
    


  • keiner da der nee Ahnung davon hat ?? Ich bekomms net hin 😞
    Ich weiss noch von C Sharp da war das schon so blöd..
    Der OnClick Handler scheint in einem anderen Thread zu laufen und kann wohl deswegen nicht gleich auf die UI zugreifen..





  • nee geht auch nicht. Ich dreh bald durch. Ich hocke das ganze Wochenende schon rum und alle meine Ansätze funktionieren nicht. Erst wenn ich das Tablelayout wieder aufmache , dann wurde die Gui refreshed. Ihr seht was ich vorhabe oder. Jemand klickt eine Zelle im TableLayout. Die Zelle bleibt 3 Sekunden blau und das Tablelayout schließt sich nach 3 sekunden. Wie läuft das eigentlich wird da für jedes abonnierte Event ein eigener Thread aufgemacht ??? Ehrlich gesagt glaub ich fast dass onClick Handler im GUI Thread ausgeführt wird.

    private View.OnClickListener playerListener = new View.OnClickListener() {
            public void onClick(View v) {
    
                 vi = (ImageView) v;
    
                vi.setBackgroundColor(Color.argb(255, 163, 237, 250));
                vi.invalidate(); // hilft nicht 
    
                player1SelectedNr = vi.getId();
                SystemClock.sleep(3000); // hier die Verzögerung
    
                table.setVisibility(View.INVISIBLE); // hier schließ ich das Tablelayout
            }
        };
    


  • 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.


Anmelden zum Antworten