188 votes

Erreur de gonflement lors de l'extension d'une classe

J'essaie de créer une vue personnalisée GhostSurfaceCameraView qui s'étend SurfaceView . Voici mon fichier de définition de classe

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

Et ceci est dans mon ghostviewscreen.xml :

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

Maintenant dans l'activité que j'ai faite :

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

Cuando setContentView() est appelé, une exception est levée :

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

Quelqu'un peut-il me dire pourquoi j'obtiens cette erreur ? Merci.

372voto

eccentricbiped Points 2321

Je pense avoir trouvé pourquoi ça ne marchait pas. Je ne fournissais un constructeur que pour le cas d'un paramètre 'context' alors que j'aurais dû fournir un constructeur pour le cas de deux paramètres 'Context, AttributeSet'. Je devais également donner un accès public au(x) constructeur(s). Voici ma solution :

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

4 votes

Parfois, les choses les plus simples peuvent poser problème :) il est bon de savoir que les deux paramètres sont utilisés pour le gonflage.

5 votes

Merci ! Nulle part dans les exemples je n'ai pu trouver la moindre mention de la nécessité de surcharger tous les constructeurs ! Vous m'avez fait gagner des heures (jours ?) de temps.

1 votes

Merci beaucoup ! Le message d'erreur est assez peu spécifique, ce qui m'a laissé perplexe pendant un moment, ils auraient dû inclure la raison (surcharge du constructeur manquante) dans leur message d'erreur.

45voto

monologish Points 197

@Tim - Les deux constructeurs ne sont pas nécessaires, seul le constructeur de l'appareil est nécessaire. ViewClassName(Context context, AttributeSet attrs ) est nécessaire. J'ai découvert cela de manière douloureuse, après des heures et des heures de perte de temps.

Je suis très novice en matière de développement Android, mais je suppose que c'est peut-être dû au fait que, depuis que nous ajoutons l'option de personnalisation de l'interface, nous ne sommes pas en mesure d'utiliser l'option de personnalisation. View dans le fichier XML, nous lui attribuons plusieurs attributs dans le XML, qui doivent être traités au moment de l'instanciation. Quelqu'un de bien plus compétent que moi sera en mesure d'apporter un éclairage plus clair sur cette question.

19voto

rmtheis Points 2007

Une autre cause possible du message "Error inflating class" peut être une mauvaise orthographe du nom complet du paquetage lorsqu'il est spécifié dans le XML :

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

L'ouverture de votre fichier XML de mise en page dans l'éditeur XML d'Eclipse devrait mettre en évidence ce problème.

2voto

Mykola Points 147

Il est important d'écrire le chemin complet de la classe dans le xml. J'ai obtenu 'Error inflating class' lorsque seul le nom de la sous-classe était écrit.

1voto

Ionoclast Brigham Points 194

J'ai eu cette erreur qui me tourmente depuis quelques heures. Il s'avère que j'avais ajouté la librairie custom view en tant que module dans Android Studio, mais que j'avais négligé de l'ajouter en tant que dépendance dans l'application build.gradle .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X