RaspberryPi – Temperatur messen und in einer Android Application anzeigen – DatePicker

Hallo Leute,

wenn ihr bereits die Teile 1 bis 3 von diesem Artikel durchgearbeitet habt, dann verfügt ihr hoffentlich über eine funktionierende Temperatur – APP. Nach mehreren Wochen sammeln und messen ist mir aufgefallen das wir keine Möglichkeit haben in ein bestimmtes Datum zu „springen“. Klar durch das seitige Scrollen können wir das gewünschte Datum problemlos erreichen, allerdings habe ich keine Lust 30 – 40 mal nach Links zu scrollen wenn ich die Temperatur vor 20 Tagen herausfinden will. Deshalb habe ich einen sogenannten „DatePicker“ in die ChartActivity eingebaut der nach einen langen Druck auf das Diagramm aufpoppt. Im Endeffekt haben wir dort die Möglichkeit sich den gewünschten Tag rauszusuchen und sich diesen dann anzeigen zu lassen.

Wetter-Teil4-Handy

Welche Klassen und was genau muss verändert werden? Wir müssen zwei Klassen bearbeiten und paar neue Methoden einfügen. Wir gehen natürlich alles Schritt für Schritt durch.Dabei ist alles was blau markiert wurde neu.

Klasse ChartData

Wir müssen drei neue „public int“ Variablen oben in der Klasse definieren (y,m,d).

private ArrayList xAxisData;
private LineDataSet yAxisData;
 
private JSONObject JsonData = null;
public String Date = null;
public int isEmpty;

public int y,m,d;

Außerdem müssen wir die Methode „GetDate“ verändern.

private String GetDate(int direction){
          SimpleDateFormat sdf = new SimpleDateFormat
                         ("yyyy-MM-dd",java.util.Locale.getDefault());
          Calendar c = Calendar.getInstance();
          if (direction != 0){
               try {
                    c.setTime(sdf.parse(Date));
               } catch (ParseException e) {
                    e.printStackTrace();
               }
               c.add(Calendar.DATE,direction);
               Date = sdf.format(c.getTime());
          }else{
               Date = sdf.format(c.getTime());
          }

y = c.get(Calendar.YEAR); m = c.get(Calendar.MONTH); d = c.get(Calendar.DAY_OF_MONTH);

          return Date;
     }

Ok, mehr müssen wir in dieser Klasse nicht machen. Was genau ist passiert? Die GetDate Methode liefert uns ja das Datum welches das Diagramm darstellen soll zurück. In den drei neuen Variablen wird das Datum (Jahr – Monat – Tag) gespeichert. Zur Info die Variable „Calender.MONTH“ fängt ab 0 an (Januar = 0 — Dezember = 11). Wofür wir diese Variablen brauchen kommt später.

Klasse ChartActivity

Hier müssen wir selbstverständlich ein bisschen mehr verändern. Zuerst brauchen wir drei neue Integer Variablen und eine Variable vom Objekttyp Date.

private int differenz,y,m,d;
private Date date_get;

Ich habe mir bei der Namensgebung der Variablen keine besondere Mühe gegeben. Ihr könnt es bestimmt besser machen. Da wir die Methode „onChartDoubleTapped“ für unsere Statistik benutzen, bleibt für unseren Datepicker nur der lange Druck auf das Diagramm übrig. Diese Funktion übernimmt dann die Methode „onChartLongPressed“:

public void onChartLongPressed(MotionEvent me) {
    differenz = 0;
    y = chartdata.year_x;
    m = chartdata.month_x;
    d = chartdata.day_x;
    date_get = new Date(y, m, d);
    Dialog datepicker = new DatePickerDialog(this, dpickerListener, y, m, d);
    datepicker.show();
 }

Zuerst setzen wir die Variable „differenz“ auf Null. Diese Variable wird uns die Differenz, zwischen dem momentan angezeigtem Datum im Diagramm und dem Datum welches wir über den Datepicker ausgewählt haben, ausgeben. Danach holen wir uns, aus der „chartdata“ Activity, die Daten in die Variablen „y“ (Year), „m“ (Month), „d“ (Day). Diese Variablen beinhalten das gerade dargestellte Datum des Diagramms. Aus diesen Variablen können wir ein neues Date Objekt erstellen welches wir der Date Variable „date_get“ dann zuweisen. Danach wird eben der oben gezeigte Datepicker erstellt. Es handelt sich hier um ein Objekt vom Typ „Dialog“. Als Parameter setzten wir zuerst den Kontext auf diese Activity also „this“. Der dpickerListerner kümmert sich um den Vorgang wenn das Objekt angezeigt wird und ein Datum ausgewählt wird, aber dazu später mehr. Als letztes setzten wir die oben erstellen Variablen für das Jahr, den Monat und den Tag fest. Somit ist gewährleistet das der Datepicker sich immer im richtigen Datum zeigt. Danach wird die Methode „show()“ aufgerufen die uns eben den Datepicker auf dem Bildschirm bringt. Was fehlt ist noch der Listener „dpickerListener“:

private DatePickerDialog.OnDateSetListener dpickerListener =
    new OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        if (view.isShown()){
            Date date_set = new Date(year, monthOfYear, dayOfMonth);
            differenz -= getDateDiff(date_set, date_get, TimeUnit.DAYS);
            chart.setData(chartdata.SetChartData(differenz));
            if (chartdata.isEmpty == 0){
                Toast.makeText(getApplicationContext(),
                    "Keine Daten für das Datum vorhanden.",Toast.LENGTH_SHORT).show();
            }
            chart.invalidate();
        }
    }
};

Ok also initialisieren wir über die Methode „onDateSetListener“ den neuen Listener der uns die Methode onDateSet anbietet. Diese Methode steuert das Verhalten wenn wir ein Datum ausgewählt haben und den Dialog schließen. Hier hatte ich das Problem das der Datepicker den Code komischerweise doppelt ausgeführt hat. Um dieses Verhalten zu unterbinden frage ich ab ob die View also der Datepicker angezeigt wird. Somit wird der restliche Code nur wie gewünscht einmal aufgerufen. Warum dieses doppelte Verhalten auftritt konnte ich noch nicht feststellen. Ist auch egal denn so geht’s eben auch. Danach holen wir uns eben das Datum welches wir über den Datepicker rausgesucht haben in die Date Variable „date_set“. In die Variable „differenz“ wird uns dann mithilfe der Methode „getDateDiff“ die Differenz zwischen „date_get“ (Diagramm) und „date_set“ (Datepicker) in Tagen ausgegeben. Wie die Methode funktioniert erkläre ich später.  Danach kommt etwas was wir bereits kennen. Wir rufen die Methode „SetChartData“ aus der Klasse „chartdata“ und übergeben dieser die ermittelte Differenz. Die Daten setzten wir dann über die Methode „setData“ in das Diagramm. Danach folgt eine Abfrage die dann auftritt wenn wir im Datepicker ein Datum ausgewählt haben zu welchem wir noch keine Daten haben. Hier wird dann eine kleine Information eingeblendet. Am Ende rufen wir die bekannte Methode „invalidate“ auf um das Diagramm zu aktualisieren. Als letztes zeige ich euch noch die Methode „getDateDiff“ die ich selber aus dem Internet habe:

public int getDateDiff(Date date1, Date date2, TimeUnit timeUnit) {
    long diffInMillies = date2.getTime() - date1.getTime();
    return (int) timeUnit.convert(diffInMillies,TimeUnit.MILLISECONDS);
}

Zuerst wird hier die Differenz in Millisekunden in die Variable „diffInmillies“ gespeichert. Dazu wird aus den zwei Daten die Zeit in Millisekunden seit dem 01.01.1970 ausgegeben. Danach können wir über das Objekt TimeUnit die Differenz als Tage darstellen und zwar mithilfe der Methode „convert“. Da die Methode immer ein „long“ zurückliefert müssen wir den Return Wert noch als ein Integer casten. Im Endeffekt sind wir damit fertig. Wie ihr sieht braucht man nicht viel Code um eine hilfreiche Funktion einzubauen. Viel Spaß beim basteln.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.