在android中将上下文类引用到XML时出错
我试图引用一个将SurfaceView扩展到XML布局的Main.class。 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
<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"
...