Error al inflar la vista personalizada

Tengo una vista personalizada de gráfico circular en la que dibujo un gráfico circular en un lienzo.

Estoy enviando los valores de gráfico circular de la actividad que está dentro de un fragmento.

Pero estoy consiguiendo el error que infla el gráfico de sectores. He intentado todas las clases de medidas pero no puedo encontrar la solución derecha

Mi actividad es …

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; } } 

Estoy llamando a la vista de esta declaración ..

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

Donde los valores son float [] = {2,7,8,9, .. anything};

Pero estoy recibiendo el 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 Cambié mis constructores y establecí los valores usando un método setter

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

Pero estoy recibiendo 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> 

Necesita un constructor con sólo los parámetros Context y AttributeSet . El parámetro values no es válido, tendrá que establecer los valores programáticamente después de inflarse.

Ejemplo:

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

Usted tiene:

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

No hay ningún método que tenga contexto y atributos solamente. Usted necesita pasar todos los parámetros requeridos.

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

¡¡Espero eso ayude!!

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.