2011-10-29 11 views
11

que tiene este diseño simple:Android - Uso SurfaceView costumbre en XML diseño

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

      <SurfaceView 
       android:id="@+id/surfaceView1" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp" 
       android:layout_weight = "1" /> 

      <LinearLayout 
       android:id="@+id/linearLayout1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:gravity="center" > 

       <Button 
        android:id="@+id/button1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="button1" /> 
       <Button 
        android:id="@+id/button2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="button2" /> 
      </LinearLayout> 
</LinearLayout> 

Esto cumple y la aplicación funciona perfectamente. que quería reemplazar el SurfaceView genérico con mi propia costumbre SurfaceView:

import android.content.Context; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback { 

    public PuzzleView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
    } 
} 

y el uso que en el xml diseño:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" > 

       <PuzzleView 
        android:id="@+id/surfaceView1" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight = "1" /> 
. 
. 
. 

Tan pronto como se crea la actividad consigo una excepción:

public class MyActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.game); 
    } 

10-29 19:56:25.921: E/AndroidRuntime(287): java.lang.RuntimeException: Unable to start activity ComponentInfo{ybz.pack1/ybz.pack1.MyActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class PuzzleView 

Esto no está permitido. No puedo encontrar ningún ejemplo para hacer esto.

Editar:
Otro entonces la solución dada a continuación, también es necesario para agregar todos los constructores de SurfaceView a PuzzleView:

public PuzzleView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

public PuzzleView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 
+0

¡Los constructores faltantes estaban rompiendo mi aplicación! ¿Cómo lo descubriste? – Anshul

Respuesta

11

En su diseño xml también hay que escribir el paquete (donde usted declara su clase) así:

<com.your.package.here.PuzzleView 
        android:id="@+id/surfaceView1" 
        android:layout_width="fill_parent" 
        android:layout_height="0dp" 
        android:layout_weight = "1" /> 
+1

Gracias. También vea mt edit. – Yoav

0

me gustaría componer la solución real a otra respuesta, desde la primera vez sobre leí el "Editar "sección en la pregunta original.

Aquí dos cosas que hay que hacer:

  1. Primera (respuesta de @luksprog)

En su diseño xml también hay que escribir el paquete (en el que declara su clase) como este:

<com.your.package.here.PuzzleView 
       android:id="@+id/surfaceView1" 
       android:layout_width="fill_parent" 
       android:layout_height="0dp" 
       android:layout_weight = "1" /> 
  1. Segundo (Editar en @Yoav)

Otro entonces la solución dada a continuación, también es requerido para añadir todos los constructores de SurfaceView a PuzzleView:

public PuzzleView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    // TODO Auto-generated constructor stub 
} 

public PuzzleView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 
Cuestiones relacionadas