Как добавить пользовательский вид в макет? - PullRequest
2 голосов
/ 12 июля 2011

У меня есть пользовательское представление

  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.

RelativeLayout содержится в ViewFlipper.Как я могу добавить свой вид к этому макету?

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

Вам не нужно добавлять свое представление с помощью кода, вы можете сделать это в формате xml, как любое представление Android: в вашем случае просто добавьте следующий код в XML, где вы не хотите, чтобы ваш взгляд

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

Тогда в своей деятельности вы можете получить его, используя

GraphView myGV = (GraphView) findViewById(R.id.myGraphView);
0 голосов
/ 13 июля 2011

Я сделал это, я просто сделал 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);
0 голосов
/ 12 июля 2011

Добавьте строку кода, как показано ниже,

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

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

diagramRelativeLayout.addView(graphView);
0 голосов
/ 12 июля 2011

Представление может иметь только одного родителя. Представление, которое вы добавляете (я предполагаю повторное использование, т. Е. GraphView), уже является частью другой иерархии представлений. Если вы действительно хотите использовать его повторно (я бы посоветовал вам этого не делать), вы должны отсоединить его от его родителя в существующей иерархии представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...