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.
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();
}
@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.
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.
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.
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.
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')
}
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.
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é
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.