2013-07-23 26 views
1

我正在使用achartengine,並且在刪除註釋然後使用不同的(x,y)值再次添加註釋時出現NullPointerException。下面是代碼:刪除註釋會導致NullPointerException重繪時

for(int n = 0; n < series.getAnnotationCount(); ++n){ 
    double x = toCoordinate(series.getAnnotationX(n)*prevTimeScale*1000, timeScale); 
    double y = series.getAnnotationY(n); 
    String text = series.getAnnotationAt(n); 

    series.removeAnnotation(n); 
    series.addAnnotation(n, text, x, y); 
} 

addAnnotation()的方法與索引不存在於當前王牌框架,但我已經加入它:

public void addAnnotation(int index, String annotation, double x, double y) { 
    mAnnotations.add(index, annotation); 
    mStringXY.put(index, x, y); 
} 

基本上我一個給定索引處移除註釋,然後我添加了相同的文本,但座標不同。調用GraphicalView#repaint()後,我得到這個NullPointerException

07-23 19:41:56.256: E/AndroidRuntime(17984): FATAL EXCEPTION: main 
07-23 19:41:56.256: E/AndroidRuntime(17984): java.lang.NullPointerException 
07-23 19:41:56.256: E/AndroidRuntime(17984): at org.achartengine.model.XYSeries.getAnnotationY(XYSeries.java:294) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at org.achartengine.chart.XYChart.draw(XYChart.java:310) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at org.achartengine.GraphicalView.onDraw(GraphicalView.java:177) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.draw(View.java:13717) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.buildDrawingCache(View.java:12971) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12634) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.draw(View.java:13433) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.drawChild(ViewGroup.java:2928) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12653) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12593) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12593) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12593) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12593) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:2910) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12593) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.View.getDisplayList(View.java:12699) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1198) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2173) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2045) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1854) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.Choreographer.doFrame(Choreographer.java:532) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.os.Handler.handleCallback(Handler.java:725) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.os.Looper.loop(Looper.java:137) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at android.app.ActivityThread.main(ActivityThread.java:5233) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at java.lang.reflect.Method.invokeNative(Native Method) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at java.lang.reflect.Method.invoke(Method.java:511) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
07-23 19:41:56.256: E/AndroidRuntime(17984): at dalvik.system.NativeStart.main(Native Method) 
07-23 19:42:03.088: E/Trace(18186): error opening trace file: No such file or directory (2) 

的問題是在使用getYByIndex(int index)IndexXYMap方法getAnnotationY(int index)

public V getYByIndex(int index) { 
    K key = indexList.get(index); 
    return this.get(key); 
} 

因爲該行return this.get(key)正在返回null,我不知道爲什麼,因爲我正在用索引添加註釋。我正在使用SVN存儲庫中的最新ace版本。

什麼可能導致問題?先謝謝你!

+0

對於Android中的新作爲我'公共無效removeAnnotation(INT索引){ mAnnotations.remove(index); mStringXY.removeByIndex(index); }其中'mAnnotations'會自動調整它的內容,所以如果我們刪除第一個註釋,所有其他註釋的索引都會改變。 – oscarthecat

回答

1

似乎目前的API不可能實現。爲此,我稍微修改了源代碼。所以,現在

/** 
    * Replaces an Annotation at the given index 
    * 
    * @param index annotation index 
    * @param annotation new String to put 
    * @param x new x coordinate to use 
    * @param y new y coordinate to use 
    */ 
    public void replaceAnnotation(int index, String annotation, double x, double y){ 
    mAnnotations.set(index, annotation); 
    mStringXY.set(index, x, y); 
    } 

更換的註解,你必須使用此方法:添加這個方法對IndexXYMap.java

public V set(int index, K key, V value){ 
    indexList.set(index, key); 
    updateMaxXDifference(); 
    return super.put(key, value); 
    } 

而且這種方法在XYSeries.java更換註釋

replaceAnnotation(index, "New Text", newX, newY); 
0

通過snv獲得achartengine後,我認爲刪除註釋並添加新的原因異常可能是因爲XYSeriesclear調用clearAnnotations()public synchronized void clearAnnotations() { mStringXY.clear(); } add mAnnotations.clear();之前mStringXY.clear();它似乎是一個錯誤。

相關問題