Bilder bei bestimmten Zeiten wechseln

  • Hallo an alle Android Studio Entwickler,


    ich bin relativ neu in der Java Entwicklung und bräuchte dringen Hilfe. Ich möchte gerne in einer Aktivity jeden Tag zu einer bestimmten Uhrzeit ein Bild wechseln.


    Hier mein Code der Hauptklasse, leider funktioniert der Aufruf der Klasse (Tage_Berechnung) nicht.


    Wie löse ich solch ein Problem am Besten. Also zu bestimmten Zeiten in genau einer Aktivity Bilder wechseln

  • Hallo erstmal willkommen im Forum.



    >leider funktioniert der Aufruf der Klasse (Tage_Berechnung) nicht.


    Kann es auch nicht
    Du erstellst nur eine Instaz der Klassee zb. in Zeile 49
    Tage_Berechnung instance_1 = new Tage_Berechnung(MainActivity.this);



    Du erstellst ein Objekt mit dem falschen gar nicht vorhandenen Kostruktor der Klasse.
    Somit kann auch nicht die Methode „berechnung_111“ aufrufen werden.



    Dein Kostrucktor
    public Tage_Berechnung (Activity _activity, int a)
    dein Auf ruf
    new Tage_Berechnung(MainActivity.this);


    System.out.println macht in Android auch nicht viel sinn. Benutze lieber ein Log dafür.



    Aber das Konzept was du verfolgst finde ich nicht so sinnvoll wenn du willst das immer jeden Tag das bild um 00.00 Uhr getauscht wird. Solltest du erst mal Prüfen welcher tag ist das richtige Bild laden. Dann kannst du einen Timer setze um bei 00:00 Uhr das Bild neu anzuzeigen.
    Denn wenn du die App beendest wir der Timer beendet. Es wird also nicht wie du vielleicht meinst im Hindergrund getauscht. Sondern nur wen die app läuft . wenn du die App wieder startest ist wieder das Bild zu sehen was im layout ist.

  • Hier nochmal meine Klassen. Sobald die Zeit von der Variablen "datum_20_11_18_Uhrzeit_00_00" erreicht ist, stürzt mein Programm ab. Irgend etwas ist beim Aufruf der Klasse falsch.

  • Leider funktioniert der Aufruf des Bildes aber nicht mehr. Wie könnte ich das lösen?
    Sobald das ImageView kommt stürzt das Programm ab.


  • Hallo also die übergabe deiner Activity ist falsch.


    Erstelle in der Main am besten einGlobale Variable Activiy und in der onCreate übergibst du ihr „this“ was ja in dem Moment deine Activity ist , und diese Variable gibst du weiter.


    Das wird zwar so gehen.


    Aber der eigentliche sinn der TimerTast Klasse ist ja die „Run“ Methode die in einem separaten Task(Thread) abläuft. Da machst du ja nichts .


    Wenn doch musst du aber auch aufpassen das du dort keinen Zugriff auf UI Elemente machen darfst denn in einen Thread keine Ausgabe auf dem Bildschirm also Zugriff auf dem Ui Thread.
    Da du alles im automatischen erstellten Konstruktor ,deiner Inneren Klasse, machst ist das ok den der läuft im UI Thread.


    Auch nur weil du in einer Inneren Klasse bist, geht es ein Statement so wie dieses im Klassenrumpf auszuführen.
    Tage_Berechnung instance_2 = new Tage_Berechnung(activity, 2);
    Würde in einer Klasse als eigene Datei nicht gehen .Da brauchst du dann den Konstruktor dazu.



    Solltest du diese Zeile aber in die Run Methode schreiben wirst du ein Problem haben denn da bist du in einen andrehen Thread. Nun wir auch deine Klasse „Tage_Berechnung“ im Thread ausgeführt und die greift auf den Ui Thread zu.





  • Ich will natürlich die Klasse Tage_Berechnung in der Run Methode aufrufen.
    Leider funktionier das aber nicht.
    ich will eigentlich nur zu bestimmten Zeiten die Bilder einer Activity wechseln.
    Wie ist da die beste Lösung.
    Danke für deine Hilfe





  • Hi
    um Bildschirm Ausgaben zu machen musst du wieder auf den UI Thread wechseln.
    Das kannst du mit einen „Handler“ machen oder mit der Methode „runOnUiThread“ und einem „runnable“ .
    Wo du das machst ist dir überlassen. Entweder du führst die gesamte Klasse „Tage_Berechnen „ im Main Thread aus, oder nur den Teil der wirklich im Main Thread laufen muss die Ausgabe auf dem Bildschirm .
    Ich bevorzuge die zweite Variante.
    Ich würde sagen das du dir mal das Thema Multi Threading in Java anschauen solltest.


    Hier der Code für die zeite Variante.


    Und hier wie du ganze Klasse in Ui startest.


  • Danke jogimuc,


    funktioniert nun super.


    Gibt es eine Möglichkeit, wenn die App geschlossen ist und die jeweiligen Zeiten erreicht sind, die App zu starten? Oder das sich das Icon auf dem Desktop ändert, das der Nutzer merkt das sich was geändert hat und er die App aufrufen kann, wie zb. bei WhatApp. Wenn eine neue Nachricht eingetroffen ist, wird ja auf dem Desktop Icon ein Zahl angezeigt die die ungelesenen Nachrichten meldet.


    Danke und viele Grüße,

  • Um etwas zu starten auch wenn die app im Hindergrund ist wäre der alarmmanager geeignet. Der dann einen pending intent schickt.


    Das ikon ändern geht nicht so ohne weiteres. Ich denke du meinst ein widget was sich ändert. Dazu müsstet du ein Homescreen Widget schreiben. Was du ach Machen kannst ist eine Benachrichtigung senden.
    Dazu würde ich den alarmmanager benutzen und einen servis der die Benachrichtigung schickt.
    Ansonsten sind Hindergrund Dienste seit android 7 und 8 schwierig geworden.

  • Ja genau ich möchte das widget ändern wenn die jeweiligen Zeiten erreicht sind, das sollte natürlich auch funktionieren wenn die App geschlossen ist, sodass der Benutzer merkt, dass sich die Bilder in der App geändert haben.
    Könntest du mir hierzu evtl. ein Programmbeispiel machen.


    Wäre super wenn du mir hierbei nochmal helfen könntest :)

  • Hallo jogimuc,


    ich habe noch ein Problem mit dem AlarmManager. Durch den Alarm Manager wird die Klasse AlarmReceiver aufgerufen. Hier möchte ich aber von der activity_main einen Butten ausblenden
    ich dachte hier an diesen Befehl:


    button1_1.setVisibility(View.VISIBLE);leider stürzt mir das Programm immer ab sobald die Klasse AlarmReceiver aufgerufen wird. Ich möchte eigentlich nur einen Butten ausblenden. Hab auch schon probiert die activity_main an die Klasse AlarmReceiver zu übergeben, geht aber leider auch nicht.Könntest du mir hier bitte weiterhelfen.Danke und viele Grüße,Michi

  • in einem brodcastresiver kannst du keine UI Bildschirm ausgaben machen.
    Schon gar nicht auf der activity . Die könnte auch gerade beendet sein und wie soll das dann gehen wenn das layout gar nicht geladen ist . Das geht nicht.
    Auch aus einem home screenwidget kannst du nicht auf die Aktivität zugreifen.
    Du könntest etwas in die sharedpref schreiben und in der onresume abfragen.

Jetzt mitmachen!

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