Jak zrobić odliczanie czasu do lekcji/dzwonka ?

0

Witam.
Mam problem, nie wiem jak zrobić instrukcję która będzie odliczała czas od "teraz" do następnej lekcji/dzwonka w szkole. Na razie zrobiłem to na "if"ach ale zajmuje to 400lini kodu i wykorzystałem przy każdym ifie np.

             else if ((today.hour == 8) && (today.minute >= 5) && (today.minute <= 14)) {
                actionBar.setTitle("Matematyka");
                int startLekcji = 5;
                int minuty = today.minute;
                setSubtitlePrzerwa(startLekcji, minuty);

taką metode:

   
    public void setSubtitlePrzerwa(int startLekcji, int minuty) {
        ActionBar actionBar = getActionBar();
        int timeLeft = (10 + startLekcji - minuty)%60;
        String timeleft = String.valueOf(timeLeft);
        actionBar.setSubtitle("za "+timeleft+"min");}

Działa jak należy ale wiem że da się to zrobić lepiej.
Proszę o pomoc.
Pozdrawiam.

0

Niepotrzebnie zakładzasz nowy temat. Może być:

else if ((today.hour == 8) && (today.minute == 50)) {
                actionBar.setTitle("Matematyka");
}

a resztę umieść na dole za ifami.
Ale lepiej te wszystkie godziny rozpoczęcia lekcji umieścić w tablicy, nazwy przedmiotów też, i robić to co powyżej w pętli.
A jeszcze fajniej byłoby zrobić klasę Przedmiot ze zmiennymi takimi jak godzinaRozpoczecia i nazwa, można wtedy by zrobić tablicę obiektów i wszystko zgrabnie odpalać w paru linijkach.
Polecam porobić zadania programistyczne na SPOJu, potem będzie ci łatwiej wymyślać rozwiązania.

dodanie znacznika <code class="java"> - furious programming

1

Jeśli chodzi o czas to looknęlam i w java8 dodali jakieś nowe bajery ;]


import java.time.Duration;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

class SchoolHelpers {
    private List<LocalTime> breaks = Arrays.asList(
            LocalTime.parse("08:45"),
            LocalTime.parse("09:40"),
            LocalTime.parse("10:25")
    );

    public Optional<Duration> timeToBreak(LocalTime now) {
        Optional<LocalTime> nextBreak = breaks.stream()
                .filter((b) -> b.isAfter(now)).findFirst();
        if (!nextBreak.isPresent()) {
            return Optional.empty();
        }
        return Optional.of(Duration.between(now, nextBreak.get()));
    }
}

public class Main {
    public static void main(String[] args) {

        List<LocalTime> lessons = Arrays.asList(
                LocalTime.parse("08:00"),
                LocalTime.parse("08:40"),
                LocalTime.parse("09:00"),
                LocalTime.parse("09:40"),
                LocalTime.parse("10:20"),
                LocalTime.parse("11:20")
        );

        SchoolHelpers schoolHelpers = new SchoolHelpers();
        for (LocalTime l : lessons) {
            Optional<Duration> remTime = schoolHelpers.timeToBreak(l);
            if (remTime.isPresent())
                System.out.println("pozostalo: " + remTime.get().toMinutes());
            else
                System.out.println("dzisiaj już nie ma przerwy siedzicie do jutra");
        }
    }
}
0

Dzięki że zechciałaś mi pomóc ale ten kod który napisałaś nie działa chyba na androidzie bo nie mogę zaimportować
java.util.Optional; java.time.LocalTime; java.time.Duration; Można to jakoś dodać do bibliotek żeby działało ?

0

Jeśli chodzi o czas to looknęlam i w java8 dodali jakieś nowe bajery

domyśl się sam...

0

Dobra zrobiłem to na tablicach i pętlach jak mi poleciliście i nie pokazuje błędu ale apka sie sypie.

protected void onResume() {
        super.onResume();
        TimeLeft Pozostaly = new TimeLeft();
        today.setToNow();
        actionBar.setTitle(Pozostaly.getLesson(today,Pozostaly.tablicaPoczatek(),Pozostaly.tablicaKoniec(), Pozostaly.tablicaLekcje()));
    }

tutaj klasa TimeLeft:

public class TimeLeft {
    public int[] tablicaPoczatek(){
        int[] poczatek = new int[8];
        poczatek[0] = 720;
        poczatek[1] = 815;
        poczatek[2] = 910;
        poczatek[3] = 1005;
        poczatek[4] = 1100;
        poczatek[5] = 1205;
        poczatek[6] = 1300;
        poczatek[7] = 1355;
        poczatek[8] = 1450;
        return poczatek;
    }

    public int[] tablicaKoniec(){
        int[] koniec = new int[8];
        koniec[0] = 805;
        koniec[1] = 900;
        koniec[2] = 955;
        koniec[3] = 1050;
        koniec[4] = 1145;
        koniec[5] = 1250;
        koniec[6] = 1345;
        koniec[7] = 1440;
        koniec[8] = 1535;
        return koniec;
    }

    public String[][] tablicaLekcje(){
        String[][] nazwaLekcji = new String[6][8];
        //poniedziałek
        nazwaLekcji[1][0] = "Matematyka";
        nazwaLekcji[1][1] = "Matematyka";
        nazwaLekcji[1][2] = "WOS";
        nazwaLekcji[1][3] = "J. POLSKI";
        nazwaLekcji[1][4] = "PST";
        nazwaLekcji[1][5] = "PST";
        nazwaLekcji[1][6] = "PST";
        nazwaLekcji[1][7] = "PST";
        nazwaLekcji[1][8] = "";
        return nazwaLekcji;
    }

    public int toTime(int arg){
        int hours = arg / 100;
        int minutes = arg % 100;
        return hours*60+minutes;
    }


    public String getLesson(Time time,int[] poczatek,int[] koniec, String[][] lekcje){
        int czas = time.hour*100 + time.minute;
        int lekcja = 0;
        int pozostalo;
        String wynik="costam";
        for (int x = 0; x < 8; x++) {
            if(czas > poczatek[x] && czas < koniec[x]){
                lekcja = x;
                break;
            }
        }


            pozostalo = toTime(poczatek[lekcja]) - toTime(czas);
            //System.out.println("Do lekcji " + lekcje[date.getDay()][lekcja+1] + " pozostalo " + pozostalo);
            wynik=lekcje[time.weekDay][lekcja+1];


        return wynik;
    }
}

*Wyciąłem tablice dla reszty dni żeby tyle kodu nie wklejać

i błąd mi wywala taki:

09-24 09:55:04.115  17177-17177/stasbar.com.planlekcji4h W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41885ce0)
09-24 09:55:04.120  17177-17177/stasbar.com.planlekcji4h E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: stasbar.com.planlekcji4h, PID: 17177
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{stasbar.com.planlekcji4h/stasbar.com.planlekcji4h.MyActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2131)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at android.app.Activity.initActionBar(Activity.java:1906)
            at android.app.Activity.getActionBar(Activity.java:1893)
            at stasbar.com.planlekcji4h.MyActivity.<init>(MyActivity.java:36)
            at java.lang.Class.newInstanceImpl(Native Method)
            at java.lang.Class.newInstance(Class.java:1208)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2122)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
            at android.app.ActivityThread.access$800(ActivityThread.java:144)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5146)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
            at dalvik.system.NativeStart.main(Native Method)
0
String[][] nazwaLekcji = new String[6][8];
        //nazwaLekcji[1][8] = ""; // nie wolno - zadeklarowano indeksy od 0 do 7 
0

Ok zmieniłem

public int[] tablicaPoczatek(){
        int[] poczatek = new int[9];
        poczatek[0] = 720;
        poczatek[1] = 815;
        poczatek[2] = 910;
        poczatek[3] = 1005;
        poczatek[4] = 1100;
        poczatek[5] = 1205;
        poczatek[6] = 1300;
        poczatek[7] = 1355;
        poczatek[8] = 1450;
        return poczatek;
    }

    public int[] tablicaKoniec(){
        int[] koniec = new int[9];
        koniec[0] = 805;
        koniec[1] = 900;
        koniec[2] = 955;
        koniec[3] = 1050;
        koniec[4] = 1145;
        koniec[5] = 1250;
        koniec[6] = 1345;
        koniec[7] = 1440;
        koniec[8] = 1535;
        return koniec;
    }

    public String[][] tablicaLekcje(){
        String[][] nazwaLekcji = new String[6][9];
        //poniedziałek
        nazwaLekcji[1][0] = "Matematyka";
        nazwaLekcji[1][1] = "Matematyka";
        nazwaLekcji[1][2] = "WOS";
        nazwaLekcji[1][3] = "J. POLSKI";
        nazwaLekcji[1][4] = "PST";
        nazwaLekcji[1][5] = "PST";
        nazwaLekcji[1][6] = "PST";
        nazwaLekcji[1][7] = "PST";
        nazwaLekcji[1][8] = "";
        return nazwaLekcji;
    }

oraz

    public String getLesson(Time time,int[] poczatek,int[] koniec, String[][] lekcje){
        int czas = time.hour*100 + time.minute;
        int lekcja = 0;
        int pozostalo;
        String wynik="costam";
        for (int x = 0; x <= poczatek.length; x++) {
            if(czas > poczatek[x] && czas < koniec[x]){
                lekcja = x;
            }
        }


            pozostalo = toTime(poczatek[lekcja]) - toTime(czas);
            wynik=lekcje[time.weekDay][lekcja+1];


        return wynik;
    }

ale nie pomaga.
Wydaje mi sie że coś z tą pętlą jest źle ale nie wiem jeszcze co.

0

@Meeki może lepiej zacznij od czystej Javy będzie Ci prościej. Jeżeli pod tego androida java 6 to może jest joda time albo zostaje Ci jakieś własne rozwiązania (np. na Date? własna klasa ? sama nie wiem). poza tym do znalezienia następnej najbliższej przerwy może ciekawy jest NavigableSet<DateTime> breaks = new TreeSet<DateTime>(new HourComparator()); albo coś w tym stylu . jutro w wolnej chwili lookkne ;]

1

Ja bym reprezentował dzień lekcji jako obiekty[to już masz] np: Lekcja, Przerwa - każda w środku stopuje się na określony czas(w środku takiego obiektu możesz mieć jakiegoś ordynarnego sleep'a), dajmy na to: new Lekcja(45min), new Przerwa(15min), new Przerwa(10mnin) etc. wrzucasz to wszystko do http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html -> Takie Queue reprezentuje dzień lekcyjny, iterujesz po tym(robisz poll()). Możesz sobie zrobić jakiś callback dla tej klasy Lekcja albo Przerwa która w całym tym Androidowym środowisku coś sobie wyrzuci na ekran - wsio :)

0

Android obsługuje javę w wersji 7 (jedynym wyjątkiem jest try-with-resources, które nie działa, jeżeli minimalne api ustawione jest na wartość niższą niż 19). Do tego co chcesz zrobić przyda się Joda time i klasa http://developer.android.com/reference/android/os/CountDownTimer.html

0

Co do rozwiązania problemu, stwórz klasę:

class Lesson {

   DateTime start, end;
   String name;

   Lesson(DateTime start, DateTime end, String name) {
      this.start =start;
      this.end = end;
      this.name = name;
   }
}

Stwórz listę takich obiektów dla danego dnia, następnie zobacz, która jest w tej chwili godzina (DateTime.now()) i przechodząc po liście sprawdzaj czy godzina znajduje się w jakimś przedziale danej lekcji. Później wystarczy tylko odjąć czas:

  DateTime wTejChwili = DateTime.now();
  long  milis = lekcja.end.getMillisOfDay() -  wTejChwili.getMillisOfDay();

 new CountDownTimer(milis , 1000) { // drugi argument określa co jaki czas odpalana jest metoda onTick (w tym przypadku co sekundę

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

Tak na koniec do konwersji milisekund na sekundy, minuty czy godziny polecam klasę TimeUnit (samemu dzieląc/mnożąc można się pomylić).

poprawienie znaczników <code class="java"> - furious programming

0

Dzięki za wszelkie rady, w końcu udało mi się to zrobić po swojemu i jestem mega zadowolony.
W końcu po 2 miesiącach teorii na tutorialach zrobiłem coś sam :D
Efekt jeszcze nie końcowy:user image
kod bez tablic z nazwami lekcji (są chyba zbędne dla was)

        LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflator.inflate(R.layout.pozostaly_czas, null);
        tvNazwaLekcji = (TextView) v.findViewById(R.id.nazwa_lekcji);
        tvPozostalyCzas = (TextView)v.findViewById(R.id.pozostaly_czas);
        actionBar.setCustomView(v);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
protected void onResume() {
        super.onResume();
        TimeLeft Pozostaly = new TimeLeft();
        int startposition = today.weekDay-1;
        if (today.hour > Pozostaly.getOstatniaLekcja(today.weekDay))
            startposition = today.weekDay;

        mViewPager.setCurrentItem(startposition, true);

        tvNazwaLekcji.setText(Pozostaly.getLesson(today,Pozostaly.tablicaPoczatek(),Pozostaly.tablicaKoniec(), Pozostaly.tablicaLekcje()));
        tvPozostalyCzas.setText(Pozostaly.getTime(today, Pozostaly.tablicaPoczatek(), Pozostaly.tablicaKoniec(), Pozostaly.tablicaLekcje()));


    }
package stasbar.com.planlekcji4h;

import android.text.format.Time;

/**
 * Created by Stanisław on 2014-09-24.
 */
public class TimeLeft {
    public int[] tablicaPoczatek(){
        int[] poczatek = new int[9];
        poczatek[0] = 720;
        poczatek[1] = 815;
        poczatek[2] = 910;
        poczatek[3] = 1005;
        poczatek[4] = 1100;
        poczatek[5] = 1205;
        poczatek[6] = 1300;
        poczatek[7] = 1355;
        poczatek[8] = 1450;
        return poczatek;
    }

    public int[] tablicaKoniec(){
        int[] koniec = new int[9];
        koniec[0] = 805;
        koniec[1] = 900;
        koniec[2] = 955;
        koniec[3] = 1050;
        koniec[4] = 1145;
        koniec[5] = 1250;
        koniec[6] = 1345;
        koniec[7] = 1440;
        koniec[8] = 1535;
        return koniec;
    }

    public String[][] tablicaLekcje(){
        String[][] nazwaLekcji = new String[6][9];

        //poniedziałek
        nazwaLekcji[1][0] = "Matematyka";
        nazwaLekcji[1][1] = "Matematyka";
        nazwaLekcji[1][2] = "WOS";
        nazwaLekcji[1][3] = "J. POLSKI";
        nazwaLekcji[1][4] = "PST";
        nazwaLekcji[1][5] = "PST";
        nazwaLekcji[1][6] = "PST";
        nazwaLekcji[1][7] = "PST";
        nazwaLekcji[1][8] = "";

        return nazwaLekcji;
    }

    public int toTime(int arg){
        int hours = arg / 100;
        int minutes = arg % 100;
        return hours*60+minutes;
    }

    String wynik;
    int lekcja = 0;
    int pozostaloMin;
    int pozostaloGodzin;
    int pierwszaLekcja;
    int ostatniaLekcja;
    public String getLesson(Time time,int[] poczatek,int[] koniec, String[][] lekcje){
        int czas = time.hour*100 + time.minute;
        pierwszaLekcja=getPierwszaLekcja(time.weekDay);
        ostatniaLekcja=getOstatniaLekcja(time.weekDay);

        for (int x = pierwszaLekcja; x < ostatniaLekcja; x++) {
            if (time.weekDay==6)
                wynik = lekcje[1][getPierwszaLekcja(1)];
            else if (time.weekDay==0)
                wynik = lekcje[1][getPierwszaLekcja(1)];
            else if (time.weekDay==5&& time.hour>ostatniaLekcja){
                wynik = lekcje[1][getPierwszaLekcja(1)];
            }
            else if(czas > poczatek[x] && czas < koniec[x]){
                lekcja = x;
                wynik="PRZERWA";
            }
            else if (czas < poczatek[x] && czas > koniec[x-1]) {
                lekcja = x;
                wynik = lekcje[time.weekDay][lekcja];

            }
            //przed lekcjami
            else if (czas<poczatek[pierwszaLekcja])
                wynik=lekcje[time.weekDay][pierwszaLekcja];

            //po lekcjach
            else if (czas>koniec[ostatniaLekcja]) {
                wynik = lekcje[time.weekDay + 1][getPierwszaLekcja(time.weekDay + 1)];
            }
        }

    return wynik;

    }
    public String getTime(Time time,int[] poczatek,int[] koniec, String[][] lekcje){
        int czas = time.hour*100 + time.minute;
        pierwszaLekcja=getPierwszaLekcja(time.weekDay);
        ostatniaLekcja=getOstatniaLekcja(time.weekDay);

        for (int x = pierwszaLekcja; x < ostatniaLekcja; x++) {
            //sobota
            if (time.weekDay==6){
                pozostaloGodzin = (toTime(poczatek[pierwszaLekcja]+4800) - toTime(czas))/60;
                pozostaloMin = (toTime(poczatek[pierwszaLekcja]+4800) - toTime(czas))%60;
            }
            //niedziela
            else if (time.weekDay==0) {
                pozostaloGodzin = (toTime(poczatek[pierwszaLekcja] + 2400) - toTime(czas)) / 60;
                pozostaloMin = (toTime(poczatek[pierwszaLekcja] + 2400) - toTime(czas)) % 60;
            }
            //piatek po lekcjach
            else if (time.weekDay==5&& time.hour>ostatniaLekcja) {
                pozostaloGodzin = (toTime(poczatek[pierwszaLekcja] + 7200) - toTime(czas)) / 60;
                pozostaloMin = (toTime(poczatek[pierwszaLekcja] + 7200) - toTime(czas)) % 60;
            }
            else if(czas > poczatek[x] && czas < koniec[x]){
                lekcja = x;
                pozostaloMin = toTime(koniec[lekcja]) - toTime(czas);
            }
            else if (czas < poczatek[x] && czas > koniec[x-1]) {
                lekcja = x;
                pozostaloMin = toTime(poczatek[lekcja]) - toTime(czas);
            }
        }

        String reGodzin = String.valueOf(pozostaloGodzin);
        String reMin= String.valueOf(pozostaloMin);
        if(pozostaloGodzin!=0){
            return "Za "+reGodzin+"h "+reMin+"min";
        }else {
            return "Za "+reMin+"min";
        }

    }

    public int getPierwszaLekcja(int dzienTygodnia){
        switch(dzienTygodnia){
            case 1:
                return 0;

            case 2:
                return 1;

            case 3:
                return 0;

            case 4:
                return 1;

            case 5:
                return 0;

            default:
                return 1;
        }
    }
    public int getOstatniaLekcja(int dzienTygodnia){
        switch(dzienTygodnia){
            case 1:
                return 7;
            case 2:
                return 8;

            case 3:
                return 7;

            case 4:
                return 7;

            case 5:
                return 5;

            default:
                return 6;
        }
    }
}

Pozdro dla hejterów-moderatorów ;)

2

Spoko, zerkniesz na ten kod za kilka miesięcy i postanowisz spalić się ze wstydu albo zapaść pod ziemię. Napisać kod który działa to i małpa da radę. Napisać kod który będzie łatwy w utrzymaniu to jest dopiero sztuka.
Moja rada -> dokonaj małej modyfikacji tego kodu.

  • Niech działa dla dowolnego zestawu przedmiotów (tzn użytkownik może sam wklepać do aplikacji jakie ma przedmioty)
  • Niech działa dla dowolnej długości zajęć (na studiach "lekcja" trwa 1:30 a czasem 2:15 a nie 45 minut)
  • Niech działa dla dowolnych wybranych dni tygodnia (na studiach możesz nie mieć zajęć w jakis dzień)
  • Niech godzina rozpoczęcia / zakończenia zajęć może być podana przez użytkownika
    Na początek tyle wystarczy. I teraz zadaj sobie pytanie: czy twój kod można łatwo zmodyfikować do takiej postaci? Nie? No właśnie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1