Im letzten Beitrag wurde das Anzeigen des Sensorwerteverlaufs implementiert. Im heutigen Beitrag wird eine weitere Activity erstellt, die den Verlauf der Sensorwerte eines bestimmten Tages anzeigt.
Gradle-Dateien anpassen
Wenn zu viele Bibliotheken in das Projekt eingebunden werden, kann es passieren, dass das Standardlimit von 64.000 Methoden überschritten wird. Um dieses Problem zu beheben, öffnest du die Datei "build.gradle (Module: mobile)". Dort fügst du dem "dependencies"-Block die folgende Zeile hinzu:compile 'com.android.support:multidex:1.0.1'
dexOptions {
javaMaxHeapSize "4g"
}
multiDexEnabled true
Activity für den Tageswerteverlauf erstellen
Als nächstes erstellst die neue Activity. Dazu klickst du mit rechts auf eine Java-Datei im Hauptpackage und wählst "New -> Activity -> Empty Activity". Gib der Activity den Namen "ValueCourseActivity" und klicke auf "Finish". Wechsle nun zur Datei "activity_value_course.xml", um das Layout der Activity zu bearbeiten. Dort änderst du zuerst den Tag des äußersten Layouts von "android.support.constraint.ConstraintLayout" in "RelativeLayout" und fügst ihm drei neue Attribute hinzu:android:id="@+id/frame"
android:padding="5dp"
android:background="@color/layoutBackground"
<com.github.mikephil.charting.charts.LineChart
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/chart"
android:visibility="gone"></com.github.mikephil.charting.charts.LineChart>
<include
layout="@layout/loading_animation"
android:visibility="gone"
android:id="@+id/loading_animation">
</include>
<include
layout="@layout/empty_item"
android:visibility="gone"
android:id="@+id/empty_item"/>
Activity implementieren
Jetzt wechselst du zur Datei "ValueCourseActivity.java". Dort werden als erstes ein paar globale Attribute angelegt:private String location, devicetype, post_id, datum, einheit;
private LineChart chart;
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//Intent abfangen
Intent intent = getIntent();
if(intent != null){
location = intent.getStringExtra(MainActivity.EXTRA_LOCATION);
devicetype = intent.getStringExtra(MainActivity.EXTRA_DEVICETYPE);
post_id = intent.getStringExtra(MainActivity.EXTRA_ID);
datum = intent.getStringExtra(MainActivity.EXTRA_START_DATE);
einheit = intent.getStringExtra(MainActivity.EXTRA_UNIT);
}
chart = (LineChart) findViewById(R.id.chart);
setTitle(datum);
loadDayData(datum);
@Override
public boolean onSupportNavigateUp(){
super.onSupportNavigateUp();
onBackPressed();
getSupportFragmentManager().popBackStack();
return true;
}
/**
* Zeigt den Verlauf des Sensors am angegebenen Datum an
* @param datum das Datum
*/
private void loadDayData(String datum){
findViewById(R.id.loading_animation).setVisibility(View.VISIBLE);
chart.setVisibility(GONE);
final Map<String, String> requestData = new HashMap<>();
requestData.put("action", "getgraphdata");
requestData.put("room", location);
requestData.put("type", devicetype);
requestData.put("id", post_id);
requestData.put("von", datum);
requestData.put("bis", datum);
requestData.put("username", SaveData.getUsername(getApplicationContext()));
requestData.put("password", SaveData.getPassword(getApplicationContext()));
HTTPRequest.sendRequest(getApplicationContext(), requestData, SaveData.getServerIp(getApplicationContext()),
new HTTPRequest.HTTPRequestCallback() {
@Override
public void onRequestResult(String result) {
findViewById(R.id.loading_animation).setVisibility(GONE);
findViewById(R.id.empty_item).setVisibility(GONE);
switch(result){
case "wrongdata":
Dialogs.fehlermeldung("Anmeldung nicht möglich!\nBitte logge dich erneut ein.",
findViewById(R.id.frame));
break;
case "unknownuser":
Dialogs.fehlermeldung("Dieser Benutzer existiert nicht!\nBitte logge dich erneut ein.",
findViewById(R.id.frame));
break;
case "nopermission":
Dialogs.fehlermeldung("Du hast dazu keine Berechtigung.",
findViewById(R.id.frame));
break;
default:
try{
JSONObject object = new JSONObject(result);
JSONArray values = object.getJSONArray("values");
einheit = object.getString("einheit");
double[] valueList = new double[values.length()];
String[] timeList = new String[values.length()];
for(int i = 0; i < values.length(); i++){
JSONObject c = values.getJSONObject(i);
valueList[i] = c.getDouble("value");
timeList[i] = c.getString("time");
}
showValueCourse(valueList, timeList);
}
catch(Exception e){
e.printStackTrace();
onError("");
}
break;
}
}
@Override
public void onError(String msg) {
findViewById(R.id.loading_animation).setVisibility(GONE);
chart.setVisibility(GONE);
findViewById(R.id.empty_item).setVisibility(View.VISIBLE);
((ImageView)findViewById(R.id.empty_icon)).setImageResource(Icons.getDrawerIcon("overview"));
((TextView)findViewById(R.id.empty_title)).setText("Fehler beim Laden");
((TextView)findViewById(R.id.empty_info)).setText("Die Verlaufsdaten konnten nicht geladen werden");
}
});
}
private void showValueCourse(double[] values, String[] time){
ArrayList<Entry> vals = new ArrayList<>();
final ArrayList<String> times = new ArrayList<>();
for(int i = 0; i < values.length; i++){
vals.add(new Entry(i, (float) values[i]));
times.add(time[i]);
}
//Einstellungen des Graphen
String title = "Werteverlauf";
if(einheit != null){
title = "Werteverlauf in "+einheit;
}
LineDataSet valueLine = new LineDataSet(vals, title);
valueLine.setMode(LineDataSet.Mode.CUBIC_BEZIER);
valueLine.setCubicIntensity(0.2f);
valueLine.setAxisDependency(YAxis.AxisDependency.LEFT);
valueLine.setColor(getResources().getColor(R.color.colorPrimary));
valueLine.setDrawCircles(false);
valueLine.setLineWidth(1.5f);
valueLine.setDrawValues(false);
Legend legend = chart.getLegend();
legend.setTextSize(20);
LineData chartLineData = new LineData(valueLine);
//Graph anzeigen
chart.animateY(500);
chart.setData(chartLineData);
chart.getDescription().setEnabled(false);
chart.setScaleYEnabled(false);
XAxis xAxis = chart.getXAxis();
xAxis.setTextSize(12f);
xAxis.setGranularity(1f);
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
try{
return times.get((int) value);
}catch(Exception e){
e.printStackTrace();
return String.valueOf(value);
}
}
});
chart.invalidate();
chart.setVisibility(View.VISIBLE);
}
Die Activity aufrufen
Damit die ValueCourseActivity auch aufgerufen wird, wechselst du zur Datei "GraphActivity.java" und scrollst ans untere Ende der Methode fillLineChart(). Hier wird im OnChartValueSelectedListener des Graphen ein Intent erstellt und damit die ValueCOurseActivity gestartet (bei mir in den Zeilen 278 - 285). Dieser Codeblock wurde im letzten Tutorial erstellt aber auskommentiert. Entferne nun die Kommentare, damit der Code ausgeführt wird://ValueCourseActivity starten
Intent intent = new Intent(GraphActivity.this, ValueCourseActivity.class);
intent.putExtra(MainActivity.EXTRA_START_DATE, dayList.get(index).getDate());
intent.putExtra(MainActivity.EXTRA_DEVICETYPE, devicetype);
intent.putExtra(MainActivity.EXTRA_ID, post_id);
intent.putExtra(MainActivity.EXTRA_LOCATION, location);
intent.putExtra(MainActivity.EXTRA_UNIT, einheit);
startActivity(intent);
Bugfix in MainActivity
Wechsle zur Datei "MainActivity.java" und ändere am Ende der Methode onCreate() den catch-Block für den Aufruf von onNavigationItemSelected() (bei mir in Zeile 106) ab, damit er so aussieht:catch(Exception e){
e.printStackTrace();
}
Dieser Beitrag hat dir gefallen?
Dann abonniere doch unseren Newsletter!