2013-08-19 39 views
7

Tuvalette pasta grafik çizdiğim bir pasta grafik özel görünümüm var.Özel görünümü şişirirken hata oluştu

Pasta grafik değerlerini bir parçanın içindeki etkinlikten gönderiyorum.

Ama

Benim faaliyettir doğru çözümü bulmak mümkün tüm önlemlerin türlü fakat çalıştık pasta chart.I şişirme hatayı alıyorum ...

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

     } 

seni arıyorum Bu açıklamada görünümden ..

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

değerindedir şamandıra [] = {2,7,8,9, .. şey};

Ama hatayı alıyorum ....

 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 

DÜZENLEME benim Kurucular değişti ve bir ayarlayıcı yöntemi

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

kullanarak değerleri ayarlamak Ama hata

alıyorum
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 = [email protected], mEditChildren = false 
08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = [email protected] 
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 = [email protected], mEditChildren = false 
08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = [email protected] 
08-20 11:35:02.685: E/ViewGroup(14994): idx = 1, child = [email protected] 
08-20 11:35:02.685: E/ViewGroup(14994): idx = 2, child = [email protected] 
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 = [email protected], mEditChildren = false 
08-20 11:35:02.685: E/ViewGroup(14994): idx = 0, child = [email protected] 

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> 

cevap

18

Sadece Context veile bir kurucuya ihtiyacınız varparametreleri. values parametresi geçersiz, şişirildikten sonra programatik olarak değerleri ayarlamanız gerekecek.

Örnek:

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

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

bunu nasıl yapacağınızı detaylandırır mısınız? – user1901079

+0

Düzenlenmiş yanıtı gör – nhaarman

+0

Aynı şeyi yaptım ama aşağıdaki hataları alıyorum..Görüşümü düzenle – user1901079

1

Sen var:

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

bağlamı vardır ve sadece nitelikleri bir yöntem yoktur. Gerekli tüm parametreleri geçmeniz gerekiyor.

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

Hope it Helps !!

İlgili konular