Custom view bloat error

I have a custom pie chart view where I draw a pie chart on canvas.

I am sending pie chart values ​​from an activity that is inside a fragment.

But I get an error by inflating a pie chart. I tried all kinds of measures, but could not find the right solution

My activity ...

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 invoking a view from this statement.

  PieChart customView = new PieChart(getActivity(), values); 

where the values ​​of float [] = {2,7,8,9, .. anything};

But I get an 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 the setter method

 public void setValues(float[] values) { this.values = values; } 

But I get an 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(14994): mChildrenCount = 1, count = 1, i = 0, child = android.widget.LinearLayout@40f45890 , mEditChildren = false 08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = android.widget.LinearLayout@40f45890 My xml is <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/black"> <RelativeLayout android:id="@+id/rel" android:layout_width="250dp" android:layout_height="250dp" android:layout_marginTop="50dp" android:layout_marginLeft="40dp" android:orientation="vertical" tools:context=".MainActivity" android:background="#000000"> <com.example.fragmentnewone.PieChart android:id="@+id/graphId" android:layout_width="match_parent" android:layout_height="match_parent"> </com.example.fragmentnewone.PieChart> <ImageView android:src="@drawable/graphic_ring" android:id="@+id/imageView_ring" android:scaleType="matrix" android:layout_height="fill_parent" android:layout_width="fill_parent"> </ImageView> <TextView android:id="@+id/textId" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp" android:textStyle="bold" /> </RelativeLayout> </RelativeLayout> 
+7
android
source share
2 answers

You need a constructor with the Context and AttributeSet parameters. The values parameter is invalid, you will need to set the values ​​programmatically after bloating.

Example:

 public PieChart(Context context, AttributeSet attrs){ super(context, attrs); } public void setValues(float[] values){ // Do stuff calculating } 
+19
source share

You have:

 Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 

there is no method that has only context and attributes. you need to pass all the necessary parameters.

 public PieChart(Context context, AttributeSet attrs, float[] values) { super(context, attrs,values); } 

Hope this helps!

+1
source share

All Articles