0

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>

しかし、実行するとエラーになります。エラーは次のとおりです。

05-29 11:57:05.713: ERROR/AndroidRuntime(806): FATAL EXCEPTION: main
05-29 11:57:05.713: ERROR/AndroidRuntime(806): java.lang.RuntimeException: Unable to start activity ComponentInfo{coba.gesture/coba.gesture.CobaGesture}: android.view.InflateException: Binary XML file line #47: Error inflating class coba.gesture.MainBaby
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.os.Looper.loop(Looper.java:123)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread.main(ActivityThread.java:3647)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at java.lang.reflect.Method.invokeNative(Native Method)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at java.lang.reflect.Method.invoke(Method.java:507)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at dalvik.system.NativeStart.main(Native Method)
05-29 11:57:05.713: ERROR/AndroidRuntime(806): Caused by: android.view.InflateException: Binary XML file line #47: Error inflating class coba.gesture.MainBaby
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.createView(LayoutInflater.java:508)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:623)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.rInflate(LayoutInflater.java:626)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.inflate(LayoutInflater.java:408)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.Activity.setContentView(Activity.java:1657)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at coba.gesture.CobaGesture.onCreate(CobaGesture.java:19)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     ... 11 more
05-29 11:57:05.713: ERROR/AndroidRuntime(806): Caused by: java.lang.NoSuchMethodException: MainBaby(Context,AttributeSet)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at java.lang.Class.getMatchingConstructor(Class.java:643)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at java.lang.Class.getConstructor(Class.java:472)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     at android.view.LayoutInflater.createView(LayoutInflater.java:480)
05-29 11:57:05.713: ERROR/AndroidRuntime(806):     ... 22 more

私の予測では、エラーは MainBaby.java から発生しますが、何が問題なのかわかりません。

アップデート。

これがあなたが欲しかった MainBaby.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);

}
}
4

1 に答える 1

1

このようにビュー タイプを拡張して XML でインスタンスを作成すると、バックグラウンドで Android が呼び出さMainBaby(Context context, AttributeSet attrs)れ、XML で定義したすべてが AttributeSet になります。ただし、オーバーライドしたのは だけMainBaby(Context context)なので、このエラーを修正するには、ここから始めます。

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()には、最初のコンストラクターからの初期化コードが含まれている必要があります。

また、含まれていないコードから何かが欠落している可能性がありますが、MainBabyここでビューを参照しようとしていますか?

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

もしそうなら、私はあなたがこれを意味したと思います:

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

最後に、AbsoluteLayout は、異なる密度の画面間で簡単に移植できないため、非推奨です。これは開発者ガイドからのものです:

3. AbsoluteLayout を使用しない

他のレイアウト ウィジェットとは異なり、AbsoluteLayout は子ビューをレイアウトするために固定位置の使用を強制するため、さまざまなディスプレイで適切に機能しないユーザー インターフェイスが簡単に発生する可能性があります。このため、AbsoluteLayout は Android 1.5 (API レベル 3) で廃止されました。

代わりに、相対配置を使用して子ビューをレイアウトする RelativeLayout を使用する必要があります。たとえば、ボタン ウィジェットがテキスト ウィジェットの「右側」に表示されるように指定できます。

于 2012-05-29T07:36:57.867 に答える