【问题标题】:Error: The specified child already has a parent错误:指定的孩子已经有一个父母
【发布时间】:2013-10-29 04:07:41
【问题描述】:

在我的程序中,我的模拟器出现此错误。 如果我在我的 Razr MAXX 上运行它,它可以工作吗?它说

10-28 19:38:27.935: E/AndroidRuntime(2268): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

错误出现在这一行:layout.addView(mid)

我相信它说 mid 已经有一个父级,所以我用ViewGroup parent = (ViewGroup) mid.getParent(); 进行了调试,它返回 null...

有人可以引导我走向正确的方向吗?

下面是我的课:

package com.example.draganddroptest;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author Brandon Ling
 * 
 */
public class HoneycombView extends View {
    private Context context;
    private ViewGroup layout;
    private HexagonView top;
    private HexagonView topRight;
    private HexagonView topLeft;
    private HexagonView bot;
    private HexagonView botLeft;
    private HexagonView botRight;
    private HexagonView mid;
    private int radius;
    private PointF shift;
    private String color;
    private String[] colors;
    private int strokeWidth;

    Paint paint = new Paint();

    /**
     * @param context
     * @param layout
     */
    public HoneycombView(Context context, AttributeSet attrs) {
        this(context, null, 0, null, null, attrs, 0);
    }

    public HoneycombView(Context context, ViewGroup layout, int radius, PointF shift, String color, AttributeSet attrs, int strokeWidth) {
        super(context);
        this.context = context;

        if (attrs != null) { // probably sent via xml
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HoneycombView);
            this.radius = a.getInt(R.styleable.HoneycombView_radius, this.strokeWidth);
            this.shift = new PointF(a.getInt(R.styleable.HoneycombView_shiftX, 0), a.getInt(
                    R.styleable.HoneycombView_shiftY, 0));
            this.colors = a.getString(R.styleable.HoneycombView_hexColors).split("\\|");
            a.recycle();
        } else {
            this.layout = layout;
            this.radius = radius;
            this.shift = shift;
            this.color = color;
        }
        this.mid = new HexagonView(this.context, null, this.radius, this.shift, this.colors[0], 10);
        this.top = mid.addHexTop(colors[1]);
        this.topRight = mid.addHexTopRight(colors[2]);
        this.topLeft = mid.addHexTopLeft(colors[3]);
        this.bot = mid.addHexBot(colors[4]);
        this.botRight = mid.addHexBotRight(colors[5]);
        this.botLeft = mid.addHexBotLeft(colors[6]);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        this.layout = (ViewGroup) this.getParent();
        ViewGroup parent = (ViewGroup) mid.getParent();
        //parent.removeAllViews();
        layout.addView(mid);
        layout.addView(top);
        layout.addView(topRight);
        layout.addView(topLeft);
        layout.addView(bot);
        layout.addView(botRight);
        layout.addView(botLeft);


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = (int) Math.ceil(this.bot.getMaxY()) + this.strokeWidth;
        int width = (int) Math.ceil(this.botRight.getMaxX()) + this.strokeWidth;
        setMeasuredDimension(width, height);
    }
}

【问题讨论】:

  • 你想做什么?您不应该在 onDraw() 中进行布局
  • 我正在尝试从其他视图构建一个视图(由六边形组成的蜂窝)depositphotos.com/1830169/stock-illustration-Honeycomb.html
  • 然后将 HoneycombView() 设为 ViewGroup 或 绘制onDraw()中的六边形
  • 我尝试在 onDraw 中绘制六边形,但仍然出现错误。我会尝试视图组。但是,为什么它可以在我的手机而不是模拟器上运行?
  • onDraw() 被 Android 反复调用。第二次调用onDraw() 将抛出此异常,因为每个View 都已添加到父级。

标签: java android layout view


【解决方案1】:
  1. onDraw() 被 Android 反复调用。第二次调用onDraw() 将抛出此异常,因为每个View 都已添加到父级。

  2. 也就是说,作为一项规则,您永远不会更改 onDraw() 内部的布局。此方法仅适用于在Canvas 上绘画。即使您设法通过调用 removeAllViews() 来修复此异常(看起来您可能已经尝试过了),您仍将强制 Android 在视图被删除和重新添加时一次又一次地不断测量和绘制布局。

  3. 您可能实际上并不想将您的子视图添加到父视图。如果要添加子视图,应将它们添加为 HoneyCombView 的子视图。为此,您需要扩展 ViewGroup 而不是 View。再次,将子视图添加到其他位置,而不是 onDraw()

  4. 虽然将子视图添加到 ViewGroup 会起作用,但它对性能不是很好。您添加到布局的每个子视图都会减慢应用程序的速度。 (参见Use Fewer Views。)更好的选择是使用(例如)canvas.drawPath() 直接在Canvas 上绘制形状。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2017-05-21
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多