188 votos

Error al inflar una clase

Estoy tratando de crear una vista personalizada GhostSurfaceCameraView que se extiende SurfaceView . Este es mi archivo de definición de clases

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:

<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

¿Puede alguien decirme por qué me sale este error? Gracias.

369voto

eccentricbiped Puntos 2321

Creo que he descubierto por qué no funcionaba. Sólo estaba proporcionando un constructor para el caso de un parámetro 'contexto' cuando debería haber proporcionado un constructor para el caso de dos parámetros 'Contexto, AttributeSet'. También tenía que dar acceso público al constructor(es). Esta es 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();
        }

45voto

monologish Puntos 197

@Tim - Ambos constructores no son necesarios, sólo el ViewClassName(Context context, AttributeSet attrs ) es necesario el constructor. Lo descubrí de la forma más dolorosa, después de horas y horas de pérdida de tiempo.

Soy muy nuevo en el desarrollo de Android, pero estoy haciendo una conjetura aquí, que tal vez debido al hecho de que desde que estamos añadiendo la costumbre View en el archivo XML, estamos estableciendo varios atributos en el XML, que necesitan ser procesados en el momento de la instanciación. Sin embargo, alguien con mucho más conocimiento que yo podrá aclarar este asunto.

19voto

rmtheis Puntos 2007

Otra posible causa del mensaje "Error al inflar la clase" podría ser que se escriba mal el nombre completo del paquete donde se especifica en XML:

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

Abrir su archivo XML de diseño en el editor XML de Eclipse debería poner de manifiesto este problema.

2voto

Mykola Puntos 375

Es importante escribir la ruta completa de la clase en el xml. Obtuve 'Error al inflar la clase' cuando sólo se escribió el nombre de la subclase.

1voto

Ionoclast Brigham Puntos 194

Este error me ha estado molestando durante las últimas horas. Resulta que había añadido la librería de vistas personalizadas como un módulo en Android Studio, pero me había olvidado de añadirla como una dependencia en la aplicación de build.gradle .

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X