2011-07-12 7 views
2

J'ai une vue personnaliséeComment ajouter une vue personnalisée à la mise en page?

public GraphView(Context context, float[] values, String title, String[]horlabels, String[] verlabels, boolean type, int color) { 
    super(context); 
    if (values == null) 
     this.values = new float[0]; 
    else 
     this.values = values; 
    if (title == null) 
     title = ""; 
    else 
     this.title = title; 
    if (horlabels == null) 
     this.horlabels = new String[0]; 
    else 
     this.horlabels = horlabels; 
    if (verlabels == null) 
     this.verlabels = new String[0]; 
    else 
     this.verlabels = verlabels; 
    this.type = type; 
    paint = new Paint(); 
    this.color = color; 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    float border = 20; 
    float horstart = border * 2; 
    float height = getHeight(); 
    float width = getWidth() - 1; 
    float max = getMax(); 
    float min = getMin(); 
    float diff = max - min; 
    float graphheight = height - (2 * border); 
    float graphwidth = width - (2 * border); 

    paint.setTextAlign(Align.LEFT); 
    int vers = verlabels.length - 1; 
    for (int i = 0; i < verlabels.length; i++) { 
     paint.setColor(Color.DKGRAY); 
     float y = ((graphheight/vers) * i) + border; 
     canvas.drawLine(horstart, y, width, y, paint); 
     paint.setColor(Color.BLACK); 
     canvas.drawText(verlabels[i], 0, y, paint); 
    } 
    int hors = horlabels.length - 1; 
    for (int i = 0; i < horlabels.length; i++) { 
     paint.setColor(Color.DKGRAY); 
     float x = ((graphwidth/hors) * i) + horstart; 
     canvas.drawLine(x, height - border, x, border, paint); 
     paint.setTextAlign(Align.CENTER); 
     if (i==horlabels.length-1) 
      paint.setTextAlign(Align.RIGHT); 
     if (i==0) 
       paint.setTextAlign(Align.LEFT); 
     paint.setColor(Color.BLACK); 
     canvas.drawText(horlabels[i], x, height - 4, paint); 
    } 

    paint.setTextAlign(Align.CENTER); 
    canvas.drawText(title, (graphwidth/2) + horstart, border - 4, paint); 

    if (max != min) { 
     paint.setColor(color); 
     if (type == BAR) { 
      float datalength = values.length; 
      float colwidth = (width - (2 * border))/datalength; 
      for (int i = 0; i < values.length; i++) { 
       float val = values[i] - min; 
       float rat = val/diff; 
       float h = graphheight * rat; 
       canvas.drawRect((i * colwidth) + horstart, (border - h) + graphheight, ((i * colwidth) + horstart) + (colwidth - 1), height - (border - 1), paint); 
      } 
     } else { 
      float datalength = values.length; 
      float colwidth = (width - (2 * border))/datalength; 
      float halfcol = colwidth/2; 
      float lasth = 0; 
      for (int i = 0; i < values.length; i++) { 
       float val = values[i] - min; 
       float rat = val/diff; 
       float h = graphheight * rat; 
       if (i > 0) 
        canvas.drawLine(((i - 1) * colwidth) + (horstart + 1) + halfcol, (border - lasth) + graphheight, (i * colwidth) + (horstart + 1) + halfcol, (border - h) + graphheight, paint); 
       lasth = h; 
      } 
     } 
    } 
} 

private float getMax() { 
    float largest = Integer.MIN_VALUE; 
    for (int i = 0; i < values.length; i++) 
     if (values[i] > largest) 
      largest = values[i]; 
    return largest; 
} 

private float getMin() { 
    float smallest = Integer.MAX_VALUE; 
    for (int i = 0; i < values.length; i++) 
     if (values[i] < smallest) 
      smallest = values[i]; 
    return smallest; 
} 

et quand je l'appelle setContentView (graphView); il est bon travail, mais quand je l'appelle

  diagramRelativeLayout = (RelativeLayout)switcher.getChildAt(i).findViewById(R.id.diagramRelativeLayout); 
      diagramRelativeLayout.addView(graphView); 

c'est ne fonctionne pas.

Error:07-12 11:07:38.933: ERROR/AndroidRuntime(30488): java.lang.RuntimeException: Unable to resume activity {com.meters.src/com.meters.src.Main_Activity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

RelativeLayout contenue dans ViewFlipper. Comment puis-je ajouter ma vue à cette mise en page?

Répondre

0

je l'ai fait, je viens de faire xml avec une mise en page, et a ajouté une référence dans diagramRelativeLayout:

mon xml :

<RelativeLayout 
    android:id = "@+id/diagramRelativeLayout" 
    android:background="@layout/button_style" 
    android:layout_width="fill_parent" 
    android:layout_height = "fill_parent" 
    android:layout_marginTop = "10sp" 
    android:layout_marginLeft = "5sp" 
    android:layout_marginRight = "5sp" 
    android:layout_marginBottom = "10sp" 
    android:gravity="center"> 
    <include android:id="@+id/graph" layout="@layout/graph"/> 
    </RelativeLayout> 

Mon java:

graphLayout = (RelativeLayout)switcher.getChildAt(i).findViewById(R.id.graph); 
graphLayout.addView(graphView); 
2

Vous ne devez pas ajouter votre point de vue en utilisant le code, vous pouvez le faire en XML comme une vue android: dans votre cas il suffit d'ajouter le code suivant dans xml où vous wan't votre point de vue

<com.your.package.GraphView android:id="@+id/myGraphView" /> 

Ensuite, dans votre activité, vous pouvez le récupérer en utilisant

GraphView myGV = (GraphView) findViewById(R.id.myGraphView); 
+0

07-12 15: 15: 59,133: ERREUR/AndroidRuntime (31020): java.lang.RuntimeException: Impossible de reprendre l'activité {com.meters.src/com.meters.src.Main_Activity}: android .view.InflateException: ligne de fichier XML binaire # 136: Erreur de gonflement de la classe com.meters.src.GraphView –

0

une vue ne peut avoir qu'un seul parent. La vue que vous ajoutez (je devine ré-utiliser ie graphView) fait déjà partie d'une autre hiérarchie de vues. Si vous voulez vraiment le réutiliser (je vous suggère probablement de ne pas le faire) alors vous devez le détacher de son parent dans sa hiérarchie de vue existante.

+0

Mais comment le faire –

+0

Vérifiez que vous avez déjà ajouté ce graphView ailleurs que diagramRelativeLayout.addView (graphView); –

+0

Je l'initialise uniquement dans oncreate() 'graphView = new GraphView (contexte, valeurs," utilisation hebdomadaire (kW) ", horlabels, verlabels, GraphView.BAR, Color.RED);' –

0

Ajoutez la ligne de code comme comme suit,

diagramRelativeLayout = (RelativeLayout)switcher.getChildAt(i).findViewById(R.id.diagramRelativeLayout); 

diagramRelativeLayout.removeAllViewsInLayout(); // <-- Add this and try 

diagramRelativeLayout.addView(graphView); 
+0

merci, mais cela n'a pas aidé –

Questions connexes