在android中将上下文类引用到XML时出错

在android中将上下文类引用到XML时出错,android,layout,inflate,Android,Layout,Inflate,我试图引用一个将SurfaceView扩展到XML布局的Main.class。 XML如下所示: <AbsoluteLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <coba.gesture.Main android:id="@+id/LayoDalam" android:layout_width="fill_p

我试图引用一个将SurfaceView扩展到XML布局的Main.class。 XML如下所示:

<AbsoluteLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
>
    <coba.gesture.Main
        android:id="@+id/LayoDalam"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
    />
</AbsoluteLayout>
我的预测是错误来自mainbbaby.java,但我不知道是什么错了

更新

这是你想要的mainbbaby.java的源代码

public class MainBaby extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = MainBaby.class.getSimpleName();
private ObjBaby obaby;
private ThreadBaby thread;
private static final float TOUCH_TOLERANCE = 4;

static float static_x = 0;
static float static_y = 0;
float mX, mY;
Paint p;
Path mPath;
Canvas mCanvas;
Bitmap mBitmap;
Paint mBitmapPaint;


public MainBaby(Context context){
    super(context);


    // adding the callback (this) to the surface holder to intercept events

    getHolder().addCallback(this);

    obaby = new ObjBaby(BitmapFactory.decodeResource(getResources(), R.drawable.clue_btn), 50, 50);

    // create the game loop thread
    thread = new ThreadBaby(getHolder(), this);

    mPath = new Path();
    mBitmapPaint = new Paint(Paint.DITHER_FLAG);
    p = new Paint();
     p.setAntiAlias(true);
     p.setDither(true);
     p.setColor(Color.WHITE);
     p.setStyle(Paint.Style.STROKE);
     p.setStrokeJoin(Paint.Join.ROUND);
     p.setStrokeCap(Paint.Cap.ROUND);
     p.setStrokeWidth(12);



    setFocusable(true);

}



@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    thread.setRunning(true);
    thread.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    boolean retry = true;
    while (retry) {
        try {
            thread.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        retry = false;
    }
}

private void touch_start(float x, float y) {
    mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}

private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
        mX = x;
        mY = y;
    }
}

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, p);

    // kill this so we don't double draw
    mPath.reset();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    static_x = event.getX();
    static_y = event.getY();

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // delegating event handling to the droid
        obaby.handleActionDown((int)event.getX(), (int)event.getY());
        touch_start(static_x, static_y);



        if (event.getY() > getHeight() - 50) {
            thread.setRunning(false);
            ((Activity)getContext()).finish();
        } else {
            //Log.d(TAG, "Coords: x=" + event.getX() + ",y=" + event.getY());
        }
    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
        // the gestures
        if (obaby.isTouched()) {
            // the droid was picked up and is being dragged
            obaby.setX((int)event.getX());
            obaby.setY((int)event.getY());
            touch_move(static_x, static_y);
        }
    } if (event.getAction() == MotionEvent.ACTION_UP) {
        // touch was released
        if (obaby.isTouched()) {
            touch_up();
            obaby.setTouched(false);


        }
    }
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    // fills the canvas with black
    canvas.drawColor(Color.BLACK);



    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    canvas.drawPath(mPath, p);
    obaby.draw(canvas);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    //mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_number);
    mCanvas = new Canvas(mBitmap);

}
}

当您扩展视图类型并在这样的XML中创建实例时,Android会在后台调用
mainbbaby(上下文上下文,AttributeSet attrs)
,其中AttributeSet是您在XML中定义的所有内容。但是您只覆盖了
mainbay(上下文)
,因此要修复此错误,请从这里开始:

public MainBaby(Context context){
    super(context);
    ...
并通过尝试以下方法覆盖所有基础:

public MainBaby(Context context) {
    super(context);
    init();
}

public MainBaby(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MainBaby(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

private void init() {
    // Original constructor code here
    ...
新方法
init()
应该包含来自第一个构造函数的初始化代码

此外,我可能在未包含的代码中遗漏了一些内容,但您是否正在尝试在此处引用您的
mainbbaby
视图

<coba.gesture.Main
    android:id="@+id/LayoDalam"
    ...

你能发布mainbbaby.java源代码吗?谢谢sam。关于第3点。如何在不使用AbsoluteLayout的情况下将图像放置到特定坐标?您可以使用调整单个边距和RelativeLayout定位功能的组合来放置图像,我很高兴答案的第一部分对您有所帮助。
<coba.gesture.Main
    android:id="@+id/LayoDalam"
    ...
<coba.gesture.MainBaby
    android:id="@+id/LayoDalam"
    ...