2012-05-29 3 views
0

Я пытаюсь ссылаться на Main.class, расширяющие SurfaceView до XML-макета. XML, как это:Ошибка при ссылке Контекстный класс на XML в android

<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); 

} 
} 
+0

Можете ли вы разместить источник MainBaby.java? – user936414

+0

Я отправил источник – user1008497

ответ

1

При расширении тип представления и создать экземпляр в XML, как это, за кулисами Android называет MainBaby(Context context, AttributeSet attrs) где AttributeSet все, что определено в XML. Но вы только отвергли 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 являются устаревшими, поскольку они не являются легко переносимыми между экранами различной плотности. Это из Developer's Guide:

3. Не используйте AbsoluteLayout

В отличие от других макетов виджетов, AbsoluteLayout навязывает использование фиксированных позиций раскладывать свои мнения ребенка, что может легко привести к пользователю интерфейсы, которые плохо работают на разных дисплеях. Из-за этого AbsoluteLayout устарел в Android 1.5 (API Level 3).

Вместо этого вы должны использовать RelativeLayout, который использует относительное позиционирование для размещения своих дочерних видов. Например, вы можете указать, что виджет кнопки должен появиться «справа от» текстового виджета.

+0

спасибо sam. и о точке № 3. как я могу поместить изображение в конкретную координату, не используя AbsoluteLayout ?? – user1008497

+0

Вы можете использовать комбинацию корректировки отдельных полей и функций позиционирования RelativeLayout для размещения изображения, я рад, что первая часть моего ответа помогла. – Sam

Смежные вопросы