2017-04-09 4 views
0

Ich benutze MPAndroidChart (V3.0.1) und ich versuche, eine Möglichkeit zu finden, mehr Informationen anzuzeigen, wenn der Benutzer auf jede Spalte mit einem BarChart tippen.Mit MPandroidChart Anzeige Informationen beim Tippen auf jeden Balken

Jede Spalte enthält eventuell zusätzliche Statistiken, die erst angezeigt werden, nachdem sie angetippt wurden.

Ich habe die Dokumentation gelesen, aber wenn es da ist, habe ich es entweder verpasst oder verstehe einfach nicht, was ich gelesen habe (kein professioneller Programmierer). Hier

ist, was ich für mein Programm so weit gekommen,

public class MainActivity extends AppCompatActivity { 

protected BarChart chart; 

String[] NameArray = {"a1","a2","a3","a4","a5","a6","a7","a8","a9","a10","a11"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_main); 
    chart = (BarChart) findViewById(R.id.chart1); 

    Description desc ; 
    Legend L; 

    L = chart.getLegend(); 
    desc = chart.getDescription(); 
    desc.setText(""); 
    L.setEnabled(false); 

    YAxis leftAxis = chart.getAxisLeft(); 
    YAxis rightAxis = chart.getAxisRight(); 
    XAxis xAxis = chart.getXAxis(); 

    xAxis.setPosition(XAxisPosition.BOTTOM); 
    xAxis.setTextSize(10f); 
    xAxis.setDrawAxisLine(true); 
    xAxis.setDrawGridLines(false); 
    xAxis.setDrawLabels(true); 
    xAxis.setValueFormatter(new MyXAxisValueFormatter(NameArray)); 

    leftAxis.setTextSize(10f); 
    leftAxis.setDrawLabels(false); 
    leftAxis.setDrawAxisLine(true); 
    leftAxis.setDrawGridLines(false); 

    rightAxis.setDrawAxisLine(false); 
    rightAxis.setDrawGridLines(false); 
    rightAxis.setDrawLabels(false); 


    BarData data = new BarData( setData()); 


    data.setBarWidth(0.9f); // set custom bar width 
    chart.setData(data); 

    chart.setFitBars(true); // make the x-axis fit exactly all bars 
    chart.invalidate(); // refresh 
    chart.setScaleEnabled(false); 

    chart.setDoubleTapToZoomEnabled(false); 
    chart.setBackgroundColor(Color.rgb(255, 255, 255)); 
    chart.animateXY(2000, 2000); 
    chart.setDrawBorders(false); 
    chart.setDescription(desc); 
    chart.setDrawValueAboveBar(true);// 



} 


private BarDataSet setData() { 

    ArrayList<BarEntry> entries = new ArrayList<>(); 

    entries.add(new BarEntry(0f, 30f, "VB")); 
    entries.add(new BarEntry(1f, 80f, "V0")); 
    entries.add(new BarEntry(2f, 60f, "V1")); 
    entries.add(new BarEntry(3f, 50f, "V2")); 
    entries.add(new BarEntry(4f, 70f, "V3")); 
    entries.add(new BarEntry(5f, 60f, "V4")); 

    BarDataSet set = new BarDataSet(entries,""); 

    set.setValueTextColor(Color.rgb(155, 155, 155)); 
    set.setValueFormatter(new MyValueFormatter()); 
    set.setColor(Color.rgb(155, 155, 155)); 
     return set; 
} 

public class MyValueFormatter implements IValueFormatter{ 
    @Override 
    public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) 
    { 
     return "V" + (int)value; 
    } 
} 


public class MyXAxisValueFormatter implements IAxisValueFormatter { 

    private String[] mValues; 

    private MyXAxisValueFormatter(String[] values) { 

     this.mValues = values; 
    } 

    @Override 
    public String getFormattedValue(float value, AxisBase axis) {   
     return mValues[(int) value]; 
    } 


} 

Simplified Frage

Wenn der Benutzer tippt eine der Spalten von Daten in der Tabelle, würde Ich mag meine TextViews (nicht in meinem Code), um zusätzliche Informationen über die Spalte anzuzeigen, z. B. den Durchschnitt und die Varianz der Datenspalte.

Antwort

1

In Ihrem onCreate() Methode, um diese Zeile hinzufügen,

chart.setOnChartValueSelectedListener(this); 

So können Sie auf Spalte tippen und zusätzliche Daten zeigen. Fügen Sie diese Funktionen,

protected RectF mOnValueSelectedRectF = new RectF(); 

    @Override 
    public void onValueSelected(Entry e, Highlight h) { 

     if (e == null) 
      return; 

     RectF bounds = mOnValueSelectedRectF; 
     chart.getBarBounds((BarEntry) e, bounds); 
     MPPointF position = mChart.getPosition(e, AxisDependency.LEFT); 

     Log.i("bounds", bounds.toString()); 
     Log.i("position", position.toString()); 

     Log.i("x-index", 
       "low: " + chart.getLowestVisibleX() + ", high: " 
         + chart.getHighestVisibleX()); 

     MPPointF.recycleInstance(position); 
    } 

    @Override 
public void onNothingSelected() { } 
+0

Ich habe schon versucht, diese Umsetzung, aber meine onCreate() -Methode ist mir ein Fehler geben: Fehler: (63, 47) Fehler: inkompatible Typen: MainActivity nicht zu OnChartValueSelectedListener umgewandelt werden kann – Diesel

+0

auch benötigt Hinzufügen von "implementiert OnChartValueSelectedListener" zu meiner MainActivity wie folgt: "öffentliche Klasse MainActivity erweitert AppCompatActivity implementiert OnChartValueSelectedListener { ". – Diesel

Verwandte Themen