Error al inflar al extender una clase

SurfaceView crear una vista personalizada GhostSurfaceCameraView que extienda SurfaceView . Aquí está mi archivo de definición de 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 está en mi ghostviewscreen.xml:

  

Ahora en la actividad que hice:

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

Cuando se llama a setContentView() , 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 puede decirme por qué me sale este error? Gracias.

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

@Tim: no se requieren ambos constructores, solo es necesario el constructor ViewClassName(Context context, AttributeSet attrs ) . 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 que puede deberse al hecho de que, como estamos agregando la clase de View personalizada en el archivo XML, le estamos asignando varios atributos en el XML, que necesita ser procesado en el momento de la instanciación. Sin embargo, alguien mucho más entendido que yo podrá arrojar luz más clara sobre este asunto.

Otra posible causa del mensaje “Error inflating class” podría estar escribiendo mal el nombre completo del paquete donde se especifica en XML:

  

La apertura de su archivo XML de diseño en el editor XML de Eclipse debería resaltar este problema.

Es importante escribir una ruta de clase completa en el xml. Obtuve ‘Error inflating class’ cuando solo se escribió el nombre de la subclase.

Tuve este error plagado de mí en las últimas horas. Resultó que había agregado la versión de visualización personalizada como un módulo en Android Studio, pero había olvidado agregarlo como una dependencia en build.gradle la aplicación.

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

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 solo defino un constructor, el que tiene 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.

en mi caso agregué tal recurso cíclico:

 @drawable/above_shadow 

luego cambió a

 @drawable/other_name 

Y funcionó

fwiw , recibí este error debido a una inicialización personalizada dentro del constructor que intenta acceder a un objeto nulo.

En mi caso, copié mi clase de otro lugar y no me di cuenta inmediatamente de que era una clase abstract . No puedes inflar clases abstractas.