it-swarm.com.de

Fehler beim Aufblasen beim Erweitern einer Klasse

Ich versuche, eine benutzerdefinierte Ansicht GhostSurfaceCameraView zu erstellen, die SurfaceView erweitert. Hier ist meine Klassendefinitionsdatei 

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

Und das ist in meiner ghostviewscreen.xml:

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

Jetzt in der Aktivität, die ich gemacht habe: 

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

Wenn setContentView() aufgerufen wird, wird eine Ausnahme ausgelöst: 

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

Kann mir jemand sagen, warum ich diesen Fehler bekomme? Vielen Dank.

185
eccentricbiped

Ich glaube, ich habe herausgefunden, warum das nicht funktioniert hat. Ich habe nur einen Konstruktor für den Fall eines Parameters 'context' bereitgestellt, wenn ich einen Konstruktor für die beiden Parameter 'Context, AttributeSet' hätte angeben sollen. Ich musste auch die Konstruktoren öffentlich zugänglich machen. Hier ist mein Fix:

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 - Beide Konstruktoren sind nicht erforderlich, nur der ViewClassName(Context context, AttributeSet attrs )-Konstruktor ist erforderlich. Ich fand das auf schmerzhafte Weise heraus, nach Stunden und Stunden verschwendeter Zeit. 

Ich bin sehr neu in der Android-Entwicklung, aber ich schätze, dass dies darauf zurückzuführen ist, dass die benutzerdefinierte View-Klasse in der XML-Datei hinzugefügt wird. Daher haben wir einige Attribute in der XML-Datei, die muss zum Zeitpunkt der Instantiierung verarbeitet werden. Jemand, der weit wissender ist als ich, wird in der Lage sein, diese Angelegenheit klarer zu beleuchten. 

45
KVNam

Eine andere mögliche Ursache für die Meldung "Fehler beim Aufblasen der Klasse" könnte darin bestehen, dass der vollständige Paketname falsch geschrieben wird, wenn er in XML angegeben ist:

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

Wenn Sie Ihre Layout-XML-Datei im Eclipse-XML-Editor öffnen, sollte dieses Problem hervorgehoben werden.

18
rmtheis

Es ist wichtig, den vollständigen Klassenpfad in die XML-Datei zu schreiben. __ Ich habe die Meldung "Fehler beim Aufblasen der Klasse" erhalten, wenn nur der Name der Unterklasse geschrieben wurde.

2
Mykola

fwiw , Ich habe diesen Fehler aufgrund einer benutzerdefinierten Initialisierung im Konstruktor erhalten, die versucht, auf ein Nullobjekt zuzugreifen.

1
Tom Howard

Ich hatte diesen Fehler in den letzten Stunden geplagt. Es stellte sich heraus, dass ich die benutzerdefinierte Ansicht lib als Modul in Android Studio hinzugefügt hatte, aber ich hatte es unterlassen, es als Abhängigkeit in build.gradle der App hinzuzufügen.

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

In meinem Fall habe ich meine Klasse von einem anderen Ort kopiert und nicht gleich bemerkt, dass es sich um eine abstract-Klasse handelt. Sie können abstrakte Klassen nicht aufblasen.

0
IsaiahJ

in meinem Fall habe ich eine solche zyklische Ressource hinzugefügt:

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

dann geändert zu 

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

und es hat funktioniert

0
Evgenii Vorobei

Ich hatte das gleiche Problem, ein TextEdit zu erweitern. Für mich war der Fehler, dass ich den Konstruktor nicht "public" hinzugefügt habe. In meinem Fall funktioniert es auch, wenn ich nur einen Konstruktor definiere, den mit den Argumenten Context und AttributeSet. Die Sache mit dem Kabel ist, dass der Fehler sich nur dann zeigt, wenn ich eine APK (singed or not) baue und sie auf die Geräte übertrage. Wenn die Anwendung über AndroidStudio -> RunApp auf einem über USB angeschlossenen Gerät ausgeführt wird, funktioniert die App.

0
Nicola Mingotti