Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
183 views
in Technique[技术] by (71.8m points)

android - Error inflating custom view

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

Example:

public PieChart(Context context, AttributeSet attrs){
    super(context, attrs);
}

public void setValues(float[] values){
    // Do stuff calculating
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...