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.

1voto

Tom Howard Points 103

fwiw J'ai reçu cette erreur en raison d'une initialisation personnalisée dans le constructeur qui tente d'accéder à un objet nul.

0voto

Nicola Mingotti Points 579

J'ai eu le même problème en étendant un TextEdit. Pour moi, l'erreur est de ne pas avoir ajouté "public" au constructeur. Dans mon cas, cela fonctionne même si je ne définis qu'un seul constructeur, celui avec des arguments. Context y AttributeSet . Le problème est que le bug ne se révèle que lorsque je construis un APK (singé ou non) et que je le transfère sur les appareils. Lorsque l'application est exécutée via AndroidStudio -> RunApp sur un appareil connecté en USB, l'application fonctionne.

0voto

Evgenii Vorobei Points 310

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

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

puis changé en

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

et cela a fonctionné

0voto

IsaiahJ Points 413

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 abstract classe. Vous ne pouvez pas gonfler les classes abstraites.

0voto

kush Points 127

Ce qu'il faut comprendre ici, c'est que :

Le constructeur ViewClassName(Context context, AttributeSet attrs ) est appelé lors du gonflement du customView via xml. Vous voyez que vous n'utilisez pas le mot clé new pour instancier votre objet, c'est à dire que vous ne faites pas new GhostSurfaceCameraView() . En faisant cela vous appellent le premier constructeur, c'est-à-dire public View (Context context) .

Alors que lors du gonflement de la vue à partir de XML, c'est-à-dire lors de l'utilisation de setContentView(R.layout.ghostviewscreen); ou en utilisant findViewById vous, Non, pas toi ! , le système Android appelle le ViewClassName(Context context, AttributeSet attrs ) constructeur.

C'est clair quand on lit la documentation : "Constructeur qui est appelé lors du gonflement d'une vue à partir de XML". Voir : https://developer.Android.com/reference/Android/view/View.html#View(Android.content.Context,%20android.util.AttributeSet)

Par conséquent, n'oubliez jamais le polymorphisme de base et n'oubliez jamais de lire la documentation. Cela vous évitera une tonne de maux de tête.

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