如何为布局添加自定义视图?

时间:2011-07-12 11:03:05

标签: java android layout 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;
}

当我打电话的时候             的setContentView(graphView); 它工作得很好,但是当我打电话时

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

它不起作用。

 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.

ViewFlipper中包含的RelativeLayout。我如何将我的视图添加到此布局?

4 个答案:

答案 0 :(得分:2)

您不必使用代码添加视图,您可以像任何android视图一样在xml中执行: 在你的情况下,只需在xml中添加以下代码,你不想看到

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

然后在您的活动中,您可以使用

检索它
GraphView myGV = (GraphView) findViewById(R.id.myGraphView);

答案 1 :(得分:0)

视图只能有一个父级。您正在添加的视图(我猜测重新使用即图形视图)已经是另一个视图层次结构的一部分。如果你真的想重用它(我建议你可能不这样做),那么你必须将它从现有视图层次结构中的父节点中分离出来。

答案 2 :(得分:0)

添加如下代码行,

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

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

diagramRelativeLayout.addView(graphView);

答案 3 :(得分:0)

我做到了,我只用一个布局制作了xml,并在 diagramRelativeLayout 中添加了对它的引用:

我的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>

我的java:

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