2

I have a custom view

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

and when i call setContentView(graphView); it's work good, but when i call

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

it's don't work.

 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 contained in ViewFlipper. How i can add my view to this layout?

4 Answers 4

2

You don't have to add your view using code, you can do it in xml like any android view : in your case just add the following code in xml where you wan't your view

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

Then in your activity you can retrieve it using

GraphView myGV = (GraphView) findViewById(R.id.myGraphView);
Sign up to request clarification or add additional context in comments.

1 Comment

07-12 15:15:59.133: ERROR/AndroidRuntime(31020): java.lang.RuntimeException: Unable to resume activity {com.meters.src/com.meters.src.Main_Activity}: android.view.InflateException: Binary XML file line #136: Error inflating class com.meters.src.GraphView
0

A view can only have a single parent. The view that you are adding (I am guessing re-using ie. graphView) is already part of another view hierarchy. If you really want to reuse it (I would suggest you probably dont) then you have to detach it from its parent in its existing view hierarchy.

3 Comments

Check out you have already added this graphView somewhere else than diagramRelativeLayout.addView(graphView);
I initialize it only in oncreate ()graphView = new GraphView(context, values, "Weekly Usage (kW)",horlabels, verlabels, GraphView.BAR, Color.RED);
This method, which returns the child of ViewFlipper.
0

Add the line of code like as follows,

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

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

diagramRelativeLayout.addView(graphView);

Comments

0

I did it, I just made xml with one layout, and added a reference to it in diagramRelativeLayout:

my 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>

My java:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.