MPAndroidChart饼图MarkView无法正常工作

时间:2016-05-16 12:08:19

标签: android mpandroidchart

我尝试在饼图中使用MarkView。遵循此文档https://github.com/PhilJay/MPAndroidChart/wiki/MarkerView

不幸的是,当我点击任何值时它会出错。

我的活动看起来喜欢这个

  mChart = (PieChart) findViewById(R.id.chart1);
  mChart.setDescription("");

  typeface = Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf");

  mChart.setCenterTextTypeface(typeface);
  mChart.setCenterText(generateCenterText());
  mChart.setCenterTextSize(15f);
  mChart.setCenterTextTypeface(typeface);

  // radius of the center hole in percent of maximum radius
  mChart.setHoleRadius(45f);
  mChart.setTransparentCircleRadius(50f);

  mChart.getLegend().setEnabled(false);
  mChart.setData(generatePieData());

  mChart.animateX(1500, Easing.EasingOption.EaseOutBounce);
  //mChart.animateY(1500, Easing.EasingOption.EaseInOutQuad);

  mChart.setTouchEnabled(true);

  CustomMarkerView mv = new CustomMarkerView (this, R.layout.custom_marker_view_layout);
  mChart.setMarkerView(mv);

这是我的标记类

public class CustomMarkerView extends MarkerView {

    private TextView tvContent;

    public CustomMarkerView (Context context, int layoutResource) {
        super(context, layoutResource);
        // this markerview only displays a textview
        tvContent = (TextView) findViewById(R.id.tvContent);
    }

    // callbacks everytime the MarkerView is redrawn, can be used to update the
    // content (user-interface)
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        tvContent.setText("" + e.getVal()); // set the entry-value as the display text
    }

    @Override
    public int getXOffset(float xpos) {
        // this will center the marker-view horizontally
        return -(getWidth() / 2);
    }

    @Override
    public int getYOffset(float ypos) {
        // this will cause the marker-view to be above the selected value
        return -getHeight();
    }
}

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    android:background="@drawable/marker" >

    <TextView
        android:id="@+id/tvContent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="7dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:text=""
        android:textSize="12dp"
        android:textColor="@android:color/white"
        android:ellipsize="end"
        android:singleLine="true"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

但我总是得到这个错误...

  05-16 07:50:06.321 23967-23967/com.anwarhossainbd.bdelectricbillcalculator E/AndroidRuntime: FATAL EXCEPTION: main
           Process: com.anwarhossainbd.bdelectricbillcalculator, PID: 23967
           java.lang.NullPointerException: Attempt to read from field 'float com.github.mikephil.charting.components.AxisBase.mAxisRange' on a null object reference
               at com.github.mikephil.charting.charts.Chart.drawMarkers(Chart.java:673)
               at com.github.mikephil.charting.charts.PieChart.onDraw(PieChart.java:136)
               at android.view.View.draw(View.java:16178)
               at android.view.View.updateDisplayListIfDirty(View.java:15174)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)
               at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)
               at android.view.View.updateDisplayListIfDirty(View.java:15134)
               at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
               at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
               at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
               at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
               at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
               at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
               at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
               at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
               at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
               at android.view.Choreographer.doCallbacks(Choreographer.java:670)
               at android.view.Choreographer.doFrame(Choreographer.java:606)
               at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
               at android.os.Handler.handleCallback(Handler.java:739)
               at android.os.Handler.dispatchMessage(Handler.java:95)
               at android.os.Looper.loop(Looper.java:148)
               at android.app.ActivityThread.main(ActivityThread.java:5417)
               at java.lang.reflect.Method.invoke(Native Method)
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

任何帮助?

1 个答案:

答案 0 :(得分:1)

我认为您使用的是此库的旧版本。我有同样的问题,我做了很少的搜索然后我找到了这个主题。

https://github.com/PhilJay/MPAndroidChart/issues/1713

应该在v2.2.4中修复。您可以使用新版本的库jar文件更新库。

出于某种原因,带有gradle的v2.2.4对我不起作用,我使用“com.github.PhilJay:MPAndroidChart:-SNAPSHOT”来实现新版本的库。你也可以尝试这个