2010-09-17 10 views
171

Estoy tratando de crear una vista personalizada GhostSurfaceCameraView que se extiende SurfaceView. Aquí está mi archivo de definición de claseError al inflar al ampliar una clase

GhostSurfaceCameraView.java:

public class GhostSurfaceCameraView extends SurfaceView implements SurfaceHolder.Callback { 
    SurfaceHolder mHolder; 
    Camera mCamera; 

    GhostSurfaceCameraView(Context context) { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where to draw. 
     mCamera = Camera.open(); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
      mCamera.release(); 
      mCamera = null; 
      // TODO: add more exception handling logic here 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 
     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     parameters.set("orientation", "portrait"); 
     // parameters.setRotation(90); // API 5+ 
     mCamera.setParameters(parameters); 
     mCamera.startPreview(); 
    } 
} 

Y esto es en mi ghostviewscreen.xml:

<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

Ahora en la actividad que hice:

protected void onCreate(Bundle savedInstanceState) { 
    try { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ghostviewscreen); 
    } 
} 

Cuando setContentView() se llama, se lanza una excepción:

Binary XML file 09-17 22:47:01.958: ERROR/ERROR(337): 
ERROR IN CODE: 
android.view.InflateException: Binary 
XML file line #14: Error inflating 
class 
com.alpenglow.androcap.GhostSurfaceCameraView 

¿Alguien me puede decir por qué me aparece este error? Gracias.

Respuesta

346

Creo que descubrí por qué esto no funcionaba. Solo estaba proporcionando un constructor para el caso de un parámetro 'context' cuando debería haber proporcionado un constructor para el caso de dos parámetros 'Context, AttributeSet'. También necesitaba dar acceso público al constructor (es). Aquí está mi solución:

public class GhostSurfaceCameraView extends SurfaceView implements SurfaceHolder.Callback { 
     SurfaceHolder mHolder; 
     Camera mCamera; 

     public GhostSurfaceCameraView(Context context) 
     { 
      super(context); 
      init(); 
     } 
     public GhostSurfaceCameraView(Context context, AttributeSet attrs) 
     { 
      super(context, attrs); 
      init(); 
     } 
     public GhostSurfaceCameraView(Context context, AttributeSet attrs, int defStyle) { 
      super(context, attrs, defStyle); 
      init(); 
     } 
+3

A veces las cosas más simples pueden ser un problema :) es bueno saber que ambos parámetros se usan para inflar. – Warpzit

+3

¡Gracias! ¡En ninguna parte de los ejemplos podría encontrar ninguna mención sobre la necesidad de sobrecargar a todos los constructores! Me salvaste horas (¿días?) De tiempo. –

+1

¡Muchas gracias! El mensaje de error es bastante inespecífico, lo que me ha dejado perplejo por un momento, deberían haber incluido el motivo (sobrecarga del constructor faltante) en su mensaje de error. – AgentKnopf

41

@Tim - Ambos no se requieren los constructores, sólo el ViewClassName(Context context, AttributeSet attrs) constructor es necesario. Descubrí esto de una manera dolorosa, después de horas y horas de tiempo perdido.

Soy muy nuevo en el desarrollo de Android, pero estoy adivinando aquí, que quizás debido al hecho de que estamos agregando la clase personalizada View en el archivo XML, estamos estableciendo varios atributos para ello en el XML, que debe procesarse en el momento de la creación de instancias. Sin embargo, alguien mucho más entendido que yo podrá arrojar luz más clara sobre este asunto.

+0

Esto tiene sentido, mi TextView personalizado siempre se construye con ViewClassName (Context context, AttributeSet attrs) cuando defino atributos para él en el xml. Si lo instauro sin definirlo en el archivo xml, se llama al constructor normal solo con el contexto, ViewClassName (Context context). Me preguntaba qué hace el otro constructor y de acuerdo con esto: http: //stackoverflow.com/a/4022916/1505341 respuesta, se supone que se usa para establecer un estilo base para la vista. – mass

17

Otra posible causa del mensaje "Error inflar clase" podría ser escribir incorrectamente el nombre del paquete completo en el que se especifica en XML:

<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"/> 

La apertura de su archivo XML disposición en el editor XML Eclipse debe poner de relieve este problema.

+2

Esto fue de hecho la solución para mi aplicación. com.zerokol.views.joystickview convirtió com.zerokol.views.JoystickView Y funcionó! – Andy

+0

cierto. Revise la ortografía o intente trabajar utilizando las intenciones provistas por su IDE, simplemente comience por escribir el nombre de su paquete y todas sus clases de availbale se mostrarán bajo intenciones. – Khay

+0

este era mi caso. –

1

Tuve este error que me atormentaba durante las últimas horas. Resulta que, había agregado la lib de vista personalizada como un módulo en Android Studio, pero no había tenido en cuenta agregarla como una dependencia en el build.gradle de la aplicación.

dependencies { 
    ... 
    compile project(':gifview') 
} 
2

Es importante escribir una ruta de clase completa en el xml. Recibí 'Error inflando clase' cuando solo se escribió el nombre de la subclase.

+0

Esto es muy similar a lo que sugiere @rmtheis. Posiblemente sea mejor comentar su respuesta o incluso editarla con información adicional. –

0

Tuve el mismo problema al extender un TextEdit. Para mí, el error fue no agregar "público" al constructor. En mi caso, funciona incluso si defino solo un constructor, el que tiene los argumentos Context y AttributeSet. El asunto del cableado es que el error se revela solo cuando construyo un APK (chamuscado o no) y lo transfiero a los dispositivos. Cuando la aplicación se ejecuta a través de AndroidStudio -> RunApp en un dispositivo conectado USB, la aplicación funciona.

0

en mi caso he añadido como recurso cíclico:

<drawable name="above_shadow">@drawable/above_shadow</drawable> 

luego cambió a

<drawable name="some_name">@drawable/other_name</drawable> 

y funcionó

0

fwiw, he recibido este error debido a alguna inicialización personalizada dentro del constructor que intenta acceder a un objeto nulo.

Cuestiones relacionadas