i've been doing this code about making a diagram in android, but the error keep coming, am i missing something?
package android.research.chart;
import java.io.File;
import java.io.FileOutputStream;
import org.achartengine.ChartFactory;
import org.achartengine.GraphicalView;
import org.achartengine.chart.PointStyle;
import org.achartengine.chartdemo.demo.R;
import org.achartengine.model.SeriesSelection;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import org.achartengine.tools.PanListener;
import org.achartengine.tools.ZoomEvent;
import org.achartengine.tools.ZoomListener;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;
public class XYChart extends Activity {
public static final String TYPE = "type";
private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
private XYSeries mCurrentSeries;
private XYSeriesRenderer mCurrentRenderer;
private String mDateFormat;
private GraphicalView mChartView;
private int index = 0;
@Override
protected void onRestoreInstanceState(Bundle savedState) {
super.onRestoreInstanceState(savedState);
mDataset = (XYMultipleSeriesDataset) savedState.getSerializable("dataset");
mRenderer = (XYMultipleSeriesRenderer) savedState.getSerializable("renderer");
mCurrentSeries = (XYSeries) savedState.getSerializable("current_series");
mCurrentRenderer = (XYSeriesRenderer) savedState.getSerializable("current_renderer");
mDateFormat = savedState.getString("date_format");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("dataset", mDataset);
outState.putSerializable("renderer", mRenderer);
outState.putSerializable("current_series", mCurrentSeries);
outState.putSerializable("current_renderer", mCurrentRenderer);
outState.putString("date_format", mDateFormat);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xy_chart);
mX = (EditText) findViewById(R.id.xValue);
mY = (EditText) findViewById(R.id.yValue);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.argb(100, 50, 50, 50));
mRenderer.setAxisTitleTextSize(16);
mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(15);
mRenderer.setLegendTextSize(15);
mRenderer.setMargins(new int[] { 20, 30, 15, 0 });
mRenderer.setZoomButtonsVisible(true);
mRenderer.setPointSize(10);
XYSeries series = new XYSeries("Kenaikan Gula Darah");
mDataset.addSeries(series);
mCurrentSeries = series;
XYSeriesRenderer renderer = new XYSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
renderer.setPointStyle(PointStyle.CIRCLE);
renderer.setFillPoints(true);
mCurrentRenderer = renderer;
setSeriesEnabled(true);
double x = 0;
double y = 0;
try {
x = 1;
} catch (NumberFormatException e) {
// TODO
return;
}
try {
y = 50;
} catch (NumberFormatException e) {
// TODO
return;
}
mCurrentSeries.add(x, y);
if (mChartView != null) {
mChartView.repaint();
开发者_JAVA百科 }
Bitmap bitmap = mChartView.toBitmap();
try {
File file = new File(Environment.getExternalStorageDirectory(), "test" + index++ + ".png");
FileOutputStream output = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, output);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
if (mChartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
mRenderer.setClickEnabled(true);
mRenderer.setSelectableBuffer(100);
mChartView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
double[] xy = mChartView.toRealPoint(0);
if (seriesSelection == null) {
Toast.makeText(XYChartBuilder.this, "No chart element was clicked", Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(
XYChartBuilder.this,
"Chart element in series index " + seriesSelection.getSeriesIndex()
+ " data point index " + seriesSelection.getPointIndex() + " was clicked"
+ " closest point value X=" + seriesSelection.getXValue() + ", Y=" + seriesSelection.getValue()
+ " clicked point value X=" + (float) xy[0] + ", Y=" + (float) xy[1], Toast.LENGTH_SHORT).show();
}
}
});
mChartView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
SeriesSelection seriesSelection = mChartView.getCurrentSeriesAndPoint();
if (seriesSelection == null) {
Toast.makeText(XYChartBuilder.this, "No chart element was long pressed",
Toast.LENGTH_SHORT);
return false; // no chart element was long pressed, so let something
// else handle the event
} else {
Toast.makeText(XYChartBuilder.this, "Chart element in series index "
+ seriesSelection.getSeriesIndex() + " data point index "
+ seriesSelection.getPointIndex() + " was long pressed", Toast.LENGTH_SHORT);
return true; // the element was long pressed - the event has been
// handled
}
}
});
mChartView.addZoomListener(new ZoomListener() {
public void zoomApplied(ZoomEvent e) {
String type = "out";
if (e.isZoomIn()) {
type = "in";
}
System.out.println("Zoom " + type + " rate " + e.getZoomRate());
}
public void zoomReset() {
System.out.println("Reset");
}
}, true, true);
mChartView.addPanListener(new PanListener() {
public void panApplied() {
System.out.println("New X range=[" + mRenderer.getXAxisMin() + ", " + mRenderer.getXAxisMax()
+ "], Y range=[" + mRenderer.getYAxisMax() + ", " + mRenderer.getYAxisMax() + "]");
}
});
layout.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
boolean enabled = mDataset.getSeriesCount() > 0;
setSeriesEnabled(enabled);
} else {
mChartView.repaint();
}
}
private void setSeriesEnabled(boolean enabled) {
mX.setEnabled(enabled);
mY.setEnabled(enabled);
mAdd.setEnabled(enabled);
}
}
i wanted to put a value to x and y manually, and i guess i need an array for it cause i get that value from my database sqlite which has many x and y value inside.
anyone can help me to solved this problem? thanks before
edit : i've got error in :
double x = 0;
double y = 0;
try {
x = 1;
} catch (NumberFormatException e) {
// TODO
return;
}
try {
y = 50;
} catch (NumberFormatException e) {
// TODO
return;
}
mCurrentSeries.add(x, y);
if (mChartView != null) {
mChartView.repaint();
}
Bitmap bitmap = mChartView.toBitmap();
try {
File file = new File(Environment.getExternalStorageDirectory(), "test" + index++ + ".png");
FileOutputStream output = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, output);
} catch (Exception e) {
e.printStackTrace();
}
but when i put x and y value by editText, it work, i don't know why, here's the code with editText :
mAdd.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
double x = 0;
double y = 0;
try {
x = Double.parseDouble(mX.getText().toString());
} catch (NumberFormatException e) {
// TODO
mX.requestFocus();
return;
}
try {
y = Double.parseDouble(mY.getText().toString());
} catch (NumberFormatException e) {
// TODO
mY.requestFocus();
return;
}
mCurrentSeries.add(x, y);
mX.setText("");
mY.setText("");
mX.requestFocus();
if (mChartView != null) {
mChartView.repaint();
}
Bitmap bitmap = mChartView.toBitmap();
try {
File file = new File(Environment.getExternalStorageDirectory(), "test" + index++ + ".png");
FileOutputStream output = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, output);
} catch (Exception e) {
e.printStackTrace();
}
}
});
the problem is i don't wanna put x and y value with editText, but i want to put x and y value from database sqlite. anyone can help me? thanks before
log :
08-25 16:42:33.975: WARN/dalvikvm(8681): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): FATAL EXCEPTION: main
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.achartengine.chartdemo.demo/org.achartengine.chartdemo.demo.XYChartBuilder}: java.lang.NullPointerException
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.os.Handler.dispatchMessage(Handler.java:99)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.os.Looper.loop(Looper.java:123)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at java.lang.reflect.Method.invokeNative(Native Method)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at java.lang.reflect.Method.invoke(Method.java:521)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at dalvik.system.NativeStart.main(Native Method)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): Caused by: java.lang.NullPointerException
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at org.achartengine.chartdemo.demo.XYChartBuilder.onCreate(XYChartBuilder.java:137)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-25 16:42:33.994: ERROR/AndroidRuntime(8681): ... 11 more
精彩评论