我正在構建一個安裝了AChartEngine的Android應用程序,並且出現奇怪的錯誤。添加點和平移後AChartEngine崩潰
後,我加點我已經建立圖表和觸摸/平移圖形,我得到了NullPointerException
在LineChart(XYChart).getSeriesAndPointForScreenCoordinate(Point)
,其中GraphicalView
的變量oldX
和oldY
被發現是空。這些變量在GraphicalView.onTouchEvent()
中設置,但顯然沒有被調用。
初始化我的圖形時是否有辦法手動觸發onTouchEvent()
,或者是否有解決此錯誤的方法?
這裏是我的表設置代碼:
mChartView = ChartFactory.getLineChartView(this, mDataset, mRenderer);
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(viewer.this,
"No chart element was clicked",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(
viewer.this,
"Chart element clicked", Toast.LENGTH_SHORT)
.show();
}
}
});
這是我如何加點:
protected class NewPoints extends AsyncTask<Double, Void, Void> {
@Override
protected Void doInBackground(Double... values) {
mCurrentSeries.add(values[0], values[1]); // x, y
if (mChartView != null) {
mChartView.repaint();
}
return null;
}
}
我的測試代碼:
for(double i = 0; i < 10; i++) {
new NewPoints().execute(i, Math.log(i));
}
這裏是logcat的輸出:
07-20 18:46:12.570: E/AndroidRuntime(13800): FATAL EXCEPTION: main
07-20 18:46:12.570: E/AndroidRuntime(13800): java.lang.NullPointerException
07-20 18:46:12.570: E/AndroidRuntime(13800): at org.achartengine.chart.XYChart.getSeriesAndPointForScreenCoordinate(XYChart.java:840)
07-20 18:46:12.570: E/AndroidRuntime(13800): at org.achartengine.GraphicalView.getCurrentSeriesAndPoint(GraphicalView.java:135)
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.maximz.viewer$1.onClick(viewer.java:185)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.view.View.performClick(View.java:3511)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.view.View$PerformClick.run(View.java:14110)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Handler.handleCallback(Handler.java:605)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Handler.dispatchMessage(Handler.java:92)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.os.Looper.loop(Looper.java:137)
07-20 18:46:12.570: E/AndroidRuntime(13800): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-20 18:46:12.570: E/AndroidRuntime(13800): at java.lang.reflect.Method.invokeNative(Native Method)
07-20 18:46:12.570: E/AndroidRuntime(13800): at java.lang.reflect.Method.invoke(Method.java:511)
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-20 18:46:12.570: E/AndroidRuntime(13800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-20 18:46:12.570: E/AndroidRuntime(13800): at dalvik.system.NativeStart.main(Native Method)
更新1:
我重新編譯與AChartEngine源代碼和調試表明,錯誤發生在這個方法:
public SeriesSelection getSeriesAndPointForScreenCoordinate(final Point screenPoint) {
if (clickableAreas != null)
for (int seriesIndex = clickableAreas.size() - 1; seriesIndex >= 0; seriesIndex--) {
// series 0 is drawn first. Then series 1 is drawn on top, and series 2
// on top of that.
// we want to know what the user clicked on, so traverse them in the
// order they appear on the screen.
int pointIndex = 0;
if (clickableAreas.get(seriesIndex) != null) {
RectF rectangle;
for (ClickableArea area : clickableAreas.get(seriesIndex)) {
rectangle = area.getRect(); // EXCEPTION HERE: area is null
if (rectangle != null && rectangle.contains(screenPoint.getX(), screenPoint.getY())) {
return new SeriesSelection(seriesIndex, pointIndex, area.getX(), area.getY());
}
pointIndex++;
}
}
}
return super.getSeriesAndPointForScreenCoordinate(screenPoint);
}
的異常被拋出在rectangle = area.getRect();
行,其中area
爲空,因爲clickableAreas.get(0)
以某種方式返回一個null clickableAreas集合。
我打算嘗試使用檢查來檢查clickableArea是否爲空,但這引出了問題:我正確添加點嗎?
你可以發佈你的Logcat指向的例外嗎? – Venkatesh 2012-07-21 05:40:59
你是否得到答案? – Venkatesh 2012-07-21 06:17:01
@Venkatesh:我編輯了問題並添加了相關的LogCat輸出。 – 2012-07-21 17:39:39