2010-09-17 14 views
171

Ich versuche, eine benutzerdefinierte Ansicht GhostSurfaceCameraView zu erstellen, die SurfaceView erweitert. Hier ist meine KlassendefinitionsdateiFehler beim Erweitern einer Klasse

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 meinem ghostviewscreen.xml:

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

Jetzt in der Tätigkeit habe ich:

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

Wenn setContentView() ruft, 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.

Antwort

346

Ich denke, ich habe herausgefunden, warum das nicht funktionierte. Ich habe nur einen Konstruktor für den Fall eines Parameterkontextes bereitgestellt, wenn ich einen Konstruktor für den zwei Parameter 'Context, AttributeSet' hätte bereitstellen sollen. Ich musste auch den Konstrukteuren öffentlichen Zugang gewähren. 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(); 
     } 
+3

Manchmal können die einfachsten Dinge ein Problem sein :) gut zu wissen, dass beide Parameter zum Aufblasen verwendet werden. – Warpzit

+3

Vielen Dank !! Nirgendwo in den Beispielen kann ich auf die Notwendigkeit hinweisen, alle Konstruktoren zu überladen! Du hast mir Stunden (Tage?) Zeit gespart. –

+1

Vielen Dank! Die Fehlermeldung ist ziemlich unspezifisch, was mich für einen Moment ratlos gemacht hat, sie hätte den Grund (fehlende Konstruktorüberladung) in ihrer Fehlermeldung enthalten sollen. – AgentKnopf

41

@ Tim - Sowohl die Konstrukteure sind nicht erforderlich, nur die ViewClassName(Context context, AttributeSet attrs) Konstruktor erforderlich. Ich fand das auf schmerzhafte Weise heraus, nach Stunden verschwendeter Zeit.

Ich bin sehr neu in Android-Entwicklung, aber ich mache eine wilde Vermutung hier, dass es möglicherweise aufgrund der Tatsache, dass, da wir die benutzerdefinierte View Klasse in der XML-Datei hinzufügen, setzen wir mehrere Attribute dazu in das XML, das zum Zeitpunkt der Instanziierung verarbeitet werden muss. Jemand, der viel besser informiert ist als ich, wird in der Lage sein, dieses Thema klarer zu beleuchten.

+0

Das macht Sinn, meine benutzerdefinierte TextView wird immer mit ViewClassName (Kontext Kontext, AttributSet attrs) erstellt, wenn ich Attribute für sie in der XML definieren. Wenn ich es instanziiere, ohne es in der XML-Datei zu definieren, wird der reguläre Konstruktor nur mit dem Kontext ViewClassName (Kontext Kontext) aufgerufen. Ich habe mich gefragt, was der andere Konstruktor tut und entsprechend: http: //stackoverflow.com/a/4022916/1505341 Antwort, es soll verwendet werden, um einen Basisstil für die Ansicht zu setzen. – mass

17

Eine weitere mögliche Ursache für den „Fehler aufblasen Klasse“ Nachrichtennamen den vollen Pakets Rechtschreibfehler sein könnte, wo es in XML angegeben ist:

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

Ihr Layout XML-Datei im Editor von Eclipse XML öffnen sollte dieses Problem markieren.

+2

Das war in der Tat die Lösung für meine Anwendung. com.zerokol.views.joystickview Ist jetzt com.zerokol.views.JoystickView Und es hat funktioniert! – Andy

+0

wahr. Überprüfen Sie die Rechtschreibprüfung oder versuchen Sie, mit den Absichten Ihrer IDE zu arbeiten. Geben Sie einfach Ihren Paketnamen ein und alle verfügbaren Klassen werden unter Absichten angezeigt. – Khay

+0

das war mein Fall. –

1

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

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

Es ist wichtig, den vollständigen Klassenpfad in der XML-Datei zu schreiben. Ich bekam 'Fehler beim Aufblasen der Klasse', wenn nur der Name der Unterklasse geschrieben wurde.

+0

Dies ist sehr ähnlich zu dem, was @rmtheis vorschlägt. Vielleicht besser, seine Antwort zu kommentieren oder sogar mit zusätzlichen Informationen zu bearbeiten. –

0

Ich hatte das gleiche Problem, ein TextEdit zu erweitern. Für mich war der Fehler, dass ich dem Konstruktor nicht "öffentlich" hinzugefügt habe. In meinem Fall funktioniert es sogar, wenn ich nur einen Konstruktor definiere, den mit den Argumenten Context und AttributeSet. Die verdrahtete Sache ist, dass der Bug sich nur offenbart, wenn ich ein APK (versenkt oder nicht) baue und es auf die Geräte übertrage. Wenn die Anwendung über AndroidStudio -> RunApp auf einem USB-Gerät ausgeführt wird, funktioniert die App.

0

in meinem Fall habe ich eine solche zyklische Ressource:

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

dann geändert

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

und es funktionierte

0

FWIW ich diesen Fehler beeinflusst durch einige benutzerdefinierte Initialisierung innerhalb des Konstruktors, der versucht, auf ein Null-Objekt zuzugreifen.

Verwandte Themen