I have a pie chart custom view where I am drawing a pie chart in a canvas.
I am sending the pie chart values from the activity which is inside a fragment.
But I am getting error inflating the pie chart.I have tried all sorts of measures but not able to find the right solution
My activity is...
public class PieChart extends View {
float valuesForDrawing[];
float valuesForDisplay[];
// private float[] values,valuesForDisplay = new float[] {};
ArrayList<ViewWasTouchedListener> listeners = new ArrayList<ViewWasTouchedListener>();
public void setWasTouchedListener(ViewWasTouchedListener listener) {
listeners.add(listener);
}
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float[] value_degree;
private float[] value_degree_for_display;
private float[] angle_list;
private int[] COLORS = { Color.BLUE, Color.GREEN, Color.MAGENTA,
Color.CYAN, Color.RED };
RectF rectf = new RectF(36, 48, 325, 330);
int temp = 0;
public PieChart(Context context, float[] values) {
super(context);
valuesForDrawing = calculateData(values);
value_degree = new float[valuesForDrawing.length];
for (int i = 0; i < values.length; i++) {
value_degree[i] = values[i];
}
valuesForDisplay = calculateDataForDisplay(values);
value_degree_for_display = new float[valuesForDisplay.length];
for (int i = 0; i < values.length; i++) {
value_degree_for_display[i] = values[i];
}
}
public PieChart(Context context, AttributeSet attrs, float[] values) {
super(context, attrs);
valuesForDrawing = calculateData(values);
value_degree = new float[valuesForDrawing.length];
for (int i = 0; i < values.length; i++) {
value_degree[i] = values[i];
}
valuesForDisplay = calculateDataForDisplay(values);
value_degree_for_display = new float[valuesForDisplay.length];
for (int i = 0; i < values.length; i++) {
value_degree_for_display[i] = values[i];
}
}
public PieChart(Context context, AttributeSet attrs, int defStyle,
float[] values) {
super(context, attrs, defStyle);
valuesForDrawing = calculateData(values);
value_degree = new float[valuesForDrawing.length];
for (int i = 0; i < values.length; i++) {
value_degree[i] = values[i];
}
valuesForDisplay = calculateDataForDisplay(values);
value_degree_for_display = new float[valuesForDisplay.length];
for (int i = 0; i < values.length; i++) {
value_degree_for_display[i] = values[i];
}
}
/*
* public void setChartData(float[] datapoints) { this.values =
* datapoints.clone(); this.valuesForDisplay = datapoints.clone();
* invalidate(); }
*/
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
for (int i = 0; i < value_degree.length; i++) {// values2.length; i++) {
if (i == 0) {
paint.setColor(COLORS[i]);
canvas.drawArc(rectf, 0, value_degree[i], true, paint);
} else {
temp += (int) value_degree[i - 1];
paint.setColor(COLORS[i]);
canvas.drawArc(rectf, temp, value_degree[i], true, paint);
}
}
for (ViewWasTouchedListener listener : listeners) {
listener.onViewDrawn(value_degree_for_display, COLORS);
}
}
private float[] calculateData(float[] data) {
// TODO Auto-generated method stub
float total = 0;
// float x=0;
for (int i = 0; i < data.length; i++) {
total += data[i];
}
for (int i = 0; i < data.length; i++) {
data[i] = 360 * (data[i] / total);
// x=x+data[i];
}
return data;
}
private float[] calculateDataForDisplay(float[] data) {
// TODO Auto-generated method stub
float total = 0;
float x = 0;
for (int i = 0; i < data.length; i++) {
total += data[i];
}
for (int i = 0; i < data.length; i++) {
data[i] = 360 * (data[i] / total);
x = x + data[i];
data[i] = x;
}
return data;
}
public float[] getValuesForDrawing() {
return valuesForDrawing;
}
public void setValuesForDrawing(float[] valuesForDrawing) {
this.valuesForDrawing = valuesForDrawing;
}
public float[] getValuesForDisplay() {
return valuesForDisplay;
}
public void setValuesForDisplay(float[] valuesForDisplay) {
this.valuesForDisplay = valuesForDisplay;
}
public ArrayList<ViewWasTouchedListener> getListeners() {
return listeners;
}
public void setListeners(ArrayList<ViewWasTouchedListener> listeners) {
this.listeners = listeners;
}
public Paint getPaint() {
return paint;
}
public void setPaint(Paint paint) {
this.paint = paint;
}
public float[] getValue_degree() {
return value_degree;
}
public void setValue_degree(float[] value_degree) {
this.value_degree = value_degree;
}
public float[] getValue_degree_for_display() {
return value_degree_for_display;
}
public void setValue_degree_for_display(float[] value_degree_for_display) {
this.value_degree_for_display = value_degree_for_display;
}
public float[] getAngle_list() {
return angle_list;
}
public void setAngle_list(float[] angle_list) {
this.angle_list = angle_list;
}
public int[] getCOLORS() {
return COLORS;
}
public void setCOLORS(int[] cOLORS) {
COLORS = cOLORS;
}
public RectF getRectf() {
return rectf;
}
public void setRectf(RectF rectf) {
this.rectf = rectf;
}
public int getTemp() {
return temp;
}
public void setTemp(int temp) {
this.temp = temp;
}
}
I am calling the view from this statement..
PieChart customView = new PieChart(getActivity(), values);
where values is
float[] = {2,7,8,9,..anything};
But I am getting the error ....
08-19 16:50:12.389: E/AndroidRuntime(27669): FATAL EXCEPTION: main
08-19 16:50:12.389: E/AndroidRuntime(27669): android.view.InflateException: Binary XML file line #17: Error inflating class com.example.fragmentnewone.PieChart
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.createView(LayoutInflater.java:589)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:680)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.rInflate(LayoutInflater.java:739)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.rInflate(LayoutInflater.java:742)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
08-19 16:50:12.389: E/AndroidRuntime(27669): at com.example.fragmentnewone.PieChartFragment.onCreateView(PieChartFragment.java:50)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.view.ViewPager.populate(ViewPager.java:1011)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.view.ViewPager.populate(ViewPager.java:880)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.support.v4.view.ViewPager$3.run(ViewPager.java:238)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.os.Handler.handleCallback(Handler.java:608)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.os.Handler.dispatchMessage(Handler.java:92)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.os.Looper.loop(Looper.java:156)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.app.ActivityThread.main(ActivityThread.java:5109)
08-19 16:50:12.389: E/AndroidRuntime(27669): at java.lang.reflect.Method.invokeNative(Native Method)
08-19 16:50:12.389: E/AndroidRuntime(27669): at java.lang.reflect.Method.invoke(Method.java:511)
08-19 16:50:12.389: E/AndroidRuntime(27669): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:991)
08-19 16:50:12.389: E/AndroidRuntime(27669): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:758)
08-19 16:50:12.389: E/AndroidRuntime(27669): at dalvik.system.NativeStart.main(Native Method)
08-19 16:50:12.389: E/AndroidRuntime(27669): Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
08-19 16:50:12.389: E/AndroidRuntime(27669): at java.lang.Class.getConstructorOrMethod(Class.java:460)
08-19 16:50:12.389: E/AndroidRuntime(27669): at java.lang.Class.getConstructor(Class.java:431)
08-19 16:50:12.389: E/AndroidRuntime(27669): at android.view.LayoutInflater.createView(LayoutInflater.java:561)
08-19 16:50:12.389: E/AndroidRuntime(27669): ... 26 more
EDIT
I changed my constructors and set the values using a setter method
public void setValues(float[] values) {
this.values = values;
}
But I am getting error
08-20 11:35:02.685: E/ViewGroup(14994): ----- NullPointerException -----
08-20 11:35:02.685: E/ViewGroup(14994): mChildrenCount = 1, count = 1, i = 0, child = android.widget.LinearLayout@40f4e838, mEditChildren = false
08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = android.widget.LinearLayout@40f4e838
08-20 11:35:02.685: E/ViewGroup(14994): ----- NullPointerException -----
08-20 11:35:02.685: E/ViewGroup(14994): mChildrenCount = 3, count = 3, i = 1, child = android.widget.FrameLayout@40f4d9b0, mEditChildren = false
08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = com.android.internal.widget.ActionBarContainer@40f463c8
08-20 11:35:02.685: E/ViewGroup(14994): idx = 1, child = android.widget.FrameLayout@40f4d9b0
08-20 11:35:02.685: E/ViewGroup(14994): idx = 2, child = com.android.internal.widget.ActionBarContainer@40f4dd58
08-20 11:35:02.685: E/ViewGroup(14994): ----- NullPointerException -----
08-20 11:35:02.685: E/ViewGroup