J'essaye 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 c'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);
}
}
Lorsqu'elle setContentView()
est appelée, 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.
View is not using the 2- **OR** 3-argument View constructors
est plutôt trompeur.@Tim - Les deux constructeurs ne sont pas obligatoires, seul le
ViewClassName(Context context, AttributeSet attrs )
constructeur est nécessaire. J'ai découvert cela de manière douloureuse, après des heures et des heures de temps perdu.Je suis très nouveau dans le développement Android, mais je suppose ici que c'est peut-être dû au fait que puisque nous ajoutons la
View
classe personnalisée dans le fichier XML, nous lui définissons plusieurs attributs dans le XML, ce qui nécessite à traiter au moment de l'instanciation. Une personne bien plus informée que moi pourra cependant éclairer plus clairement cette question.la source
Une autre cause possible du message "Erreur de gonflage de la classe" peut être une faute d'orthographe du nom complet du package là où il est spécifié en XML:
L'ouverture de votre fichier XML de mise en page dans l'éditeur XML Eclipse devrait mettre en évidence ce problème.
la source
Il est important d'écrire le chemin de classe complet dans le xml. J'ai eu 'Erreur lors du gonflage de la classe' lorsque seul le nom de la sous-classe était écrit.
la source
J'ai eu cette erreur qui me tourmentait ces dernières heures. Il s'avère que j'avais ajouté la bibliothèque de vue personnalisée en tant que module dans Android Studio, mais j'avais négligé de l'ajouter en tant que dépendance dans l'application
build.gradle
.la source
fwiw , j'ai reçu cette erreur en raison d'une initialisation personnalisée dans le constructeur essayant d'accéder à un objet nul.
la source
J'ai eu le même problème d'extension d'un TextEdit. Pour moi, l'erreur a été de ne pas ajouter «public» au constructeur. Dans mon cas, cela fonctionne même si je ne définis qu'un seul constructeur, celui avec des arguments
Context
etAttributeSet
. Le truc filaire est que le bug ne se révèle que lorsque je construis un APK (chanté 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é USB, l'application fonctionne.la source
dans mon cas, j'ai ajouté une telle ressource cyclique:
puis changé en
et ça a marché
la source
Dans mon cas, j'ai copié ma classe ailleurs et je n'ai pas remarqué tout de suite que c'était une
abstract
classe. Vous ne pouvez pas gonfler les classes abstraites.la source
La chose à comprendre ici 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 nouveau mot-clé pour instancier votre objet, c'est-à-dire que vous ne le faites pasnew GhostSurfaceCameraView()
. En faisant cela, vous appelez le premier constructeur iepublic View (Context context)
.Alors que lorsque vous gonflez la vue à partir de XML, c'est-à-dire lors de l'utilisation
setContentView(R.layout.ghostviewscreen);
ou de l'utilisationfindViewById
, vous, NON, pas vous! , le système Android appelle leViewClassName(Context context, AttributeSet attrs )
constructeur.Ceci est clair à la lecture de 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 évite une tonne de maux de tête.
la source