web-dev-qa-db-fra.com

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

J'essaie de créer une vue personnalisée GhostSurfaceCameraView qui é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);
    }
}

Lorsque 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 je reçois cette erreur? Merci.

185
eccentricbiped

Je pense avoir compris pourquoi cela ne fonctionnait pas. Je fournissais seulement un constructeur pour le cas d'un paramètre 'contexte' alors que j'aurais dû fournir un constructeur pour le cas de deux paramètres 'Contexte, AttributeSet'. J'avais également besoin de donner au constructeur (s) un accès public. 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();
        }
359
eccentricbiped

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

Je suis très nouveau dans le développement Android, mais je me permets de deviner, parce que nous ajoutons la classe personnalisée View dans le fichier XML et que nous lui affectons plusieurs attributs doit être traité au moment de l’instanciation. Une personne beaucoup plus informée que moi pourra cependant éclaircir cette question. 

45
KVNam

Une autre cause possible du message "Erreur de gonflement de classe" pourrait être une mauvaise orthographe du nom complet du package là où il est spécifié en 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 présentation dans l’éditeur XML Eclipse devrait mettre en évidence ce problème.

18
rmtheis

Il est important d’écrire le chemin complet de la classe dans le fichier XML .J’ai reçu le message «Erreur lorsqu’elle est gonflée» lorsque seul le nom de la sous-classe a été écrit.

2
Mykola

fwiw , j'ai reçu cette erreur en raison d'une initialisation personnalisée dans le constructeur qui tentait d'accéder à un objet null.

1
Tom Howard

J'ai eu cette erreur me tourmenter pendant les dernières heures. En fait, j'avais ajouté la vue personnalisée lib en tant que module dans Android Studio, mais j'avais négligé de l'ajouter en tant que dépendance dans le build.gradle de l'application.

dependencies {
    ...
    compile project(':gifview')
}
1
Ionoclast Brigham

Dans mon cas, j'ai copié ma classe d'un autre endroit et je n'ai pas remarqué tout de suite qu'il s'agissait d'une classe abstract. Vous ne pouvez pas gonfler les classes abstraites.

0
IsaiahJ

dans mon cas, j'ai ajouté une telle ressource cyclique:

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

ensuite changé en 

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

et cela a fonctionné

0
Evgenii Vorobei

J'ai eu le même problème lors de l'extension d'un TextEdit. Pour moi l’erreur était d’ajouter non "public" au constructeur. Dans mon cas, cela fonctionne même si je ne définis qu'un seul constructeur, celui avec les arguments Context et AttributeSet. Le problème, c'est que le bogue ne se révèle que lorsque je construis un APK (chanté ou non) et que je le transfère aux périphériques. Lorsque l'application est exécutée via AndroidStudio -> RunApp sur un périphérique connecté USB, l'application fonctionne.

0
Nicola Mingotti