【问题标题】:MPAndroidChart Pie chart MarkView not workingMPAndroidChart 饼图 MarkView 不起作用
【发布时间】:2016-05-16 12:08:19
【问题描述】:

我尝试在我的饼图中使用 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)

有什么帮助吗?

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    我认为您正在使用该库的旧版本。我有同样的问题,我几乎没有搜索然后我找到了这个主题。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2021-12-16
      相关资源
      最近更新 更多