Ich versuche, eine benutzerdefinierte Ansicht zu erstellen GhostSurfaceCameraView
, die erweitert wird SurfaceView
. 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);
}
}
Beim setContentView()
Aufruf 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.
View is not using the 2- **OR** 3-argument View constructors
ist irgendwie irreführend.@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 vermute hier wild, dass dies möglicherweise darauf zurückzuführen ist, dass wir, da wir die benutzerdefinierte
View
Klasse in die XML-Datei einfügen , im XML mehrere Attribute festlegen, die benötigt werden zum Zeitpunkt der Instanziierung zu verarbeiten. Jemand, der viel besser informiert ist als ich, wird in der Lage sein, diese Angelegenheit klarer zu beleuchten.quelle
Eine weitere mögliche Ursache für die Meldung "Fehler beim Aufblasen der Klasse" könnte darin bestehen, dass der vollständige Paketname, in dem er in XML angegeben ist, falsch geschrieben wurde:
Das Öffnen Ihrer Layout-XML-Datei im Eclipse-XML-Editor sollte dieses Problem hervorheben.
quelle
Es ist wichtig, den vollständigen Klassenpfad in die XML zu schreiben. Ich habe 'Fehler beim Aufblasen der Klasse' erhalten, als nur der Name der Unterklasse geschrieben wurde.
quelle
Ich hatte diesen Fehler in den letzten Stunden. Es stellte sich heraus, dass ich die benutzerdefinierte Ansicht lib als Modul in Android Studio hinzugefügt hatte, aber ich hatte es versäumt, sie als Abhängigkeit in Apps hinzuzufügen
build.gradle
.quelle
fwiw , ich habe diesen Fehler aufgrund einer benutzerdefinierten Initialisierung innerhalb des Konstruktors erhalten, der versucht, auf ein Nullobjekt zuzugreifen.
quelle
Ich hatte das gleiche Problem beim Erweitern eines TextEdit. Für mich war der Fehler, dass ich dem Konstruktor nicht "public" hinzugefügt habe. In meinem Fall funktioniert es auch, wenn ich nur einen Konstruktor definiere, den mit Argumenten
Context
undAttributeSet
. Die verdrahtete Sache ist, dass sich der Fehler nur zeigt, wenn ich eine APK (versengt oder nicht) erstelle 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.quelle
In meinem Fall habe ich eine solche zyklische Ressource hinzugefügt:
dann geändert zu
und es hat funktioniert
quelle
In meinem Fall habe ich meine Klasse von einem anderen Ort kopiert und nicht sofort bemerkt, dass es sich um eine
abstract
Klasse handelt. Sie können abstrakte Klassen nicht aufblasen.quelle
Das, was hier zu verstehen ist, ist Folgendes:
Der Konstruktor
ViewClassName(Context context, AttributeSet attrs )
wird aufgerufen, wenn die customView über XML aufgeblasen wird. Sie sehen, dass Sie das neue Schlüsselwort nicht verwenden, um Ihr Objekt zu instanziieren, dh Sie tun es nichtnew GhostSurfaceCameraView()
. Dadurch Sie den ersten Konstruktor dh nennendpublic View (Context context)
.Während beim Aufblasen der Ansicht aus XML, dh beim Verwenden
setContentView(R.layout.ghostviewscreen);
oder VerwendenfindViewById
, Sie, NEIN, nicht Sie! , ruft das Android-System dieViewClassName(Context context, AttributeSet attrs )
Konstruktor.Dies wird beim Lesen der Dokumentation deutlich: "Konstruktor, der beim Aufblasen einer Ansicht aus XML aufgerufen wird." Siehe: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)
Vergessen Sie daher niemals den grundlegenden Polymorphismus und vergessen Sie niemals das Lesen der Dokumentation. Es erspart eine Menge Kopfschmerzen.
quelle