Fout bij opblazen bij verlenging van een les

Ik probeer een aangepaste weergave GhostSurfaceCameraViewte maken die SurfaceViewuitbreidt. Hier is mijn klassedefinitiebestand

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

En dit staat in mijn ghostviewscreen.xml:

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

Nu in de activiteit die ik heb gemaakt:

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

Wanneer setContentView()wordt aangeroepen, wordt een uitzondering gegenereerd:

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

Kan iemand mij vertellen waarom ik deze foutmelding krijg? Bedankt.


Antwoord 1, autoriteit 100%

Ik denk dat ik erachter ben gekomen waarom dit niet werkte. Ik leverde alleen een constructor voor het geval van één parameter ‘context’, terwijl ik een constructor had moeten geven voor het geval van twee parameters ‘Context, AttributeSet’. Ik moest ook de constructeur(s) openbare toegang geven. Dit is mijn oplossing:

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

Antwoord 2, autoriteit 12%

@Tim – Beide constructors zijn niet vereist, alleen de ViewClassName(Context context, AttributeSet attrs )constructor is nodig. Ik ontdekte dit op de pijnlijke manier, na uren en uren van verspilde tijd.

Ik ben erg nieuw in Android-ontwikkeling, maar ik doe hier een wilde gok, dat dit misschien komt doordat we de aangepaste klasse Viewaan het XML-bestand toevoegen, het instellen van verschillende attributen in de XML, die moet worden verwerkt op het moment van instantiëren. Iemand met veel meer kennis dan ik kan hier echter meer duidelijkheid over scheppen.


Antwoord 3, autoriteit 5%

Een andere mogelijke oorzaak van het bericht “Error inflating class” kan een spelfout zijn van de volledige pakketnaam waar deze is opgegeven in XML:

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

Het openen van uw lay-out-XML-bestand in de Eclipse XML-editor zou dit probleem moeten benadrukken.


Antwoord 4

Het is belangrijk om het volledige klassenpad in de xml te schrijven.
Ik kreeg ‘Fout bij opblazen van klasse’ wanneer alleen de naam van de subklasse werd geschreven.


Antwoord 5

Ik had de afgelopen uren last van deze fout. Het bleek dat ik de aangepaste weergave-lib had toegevoegd als een module in Android Studio, maar ik had verzuimd deze toe te voegen als een afhankelijkheid in build.gradlevan de app.

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

Antwoord 6

fwiw, ik heb deze fout ontvangen vanwege een aangepaste initialisatie binnen de constructor die probeert toegang te krijgen tot een null-object.


Antwoord 7

Ik had hetzelfde probleem met het uitbreiden van een Teksteditor. Voor mij was de fout dat ik niet “openbaar” aan de constructor heb toegevoegd. In mijn geval werkt het zelfs als ik maar één constructor definieer, die met de argumenten Contexten AttributeSet. Het bedrade ding is dat de bug zich pas openbaart wanneer ik een APK bouw (gezongen of niet) en ik deze overbreng naar de apparaten. Wanneer de applicatie wordt uitgevoerd via AndroidStudio -> RunApp op een via USB aangesloten apparaat werkt de app.


Antwoord 8

in mijn geval heb ik zo’n cyclische bron toegevoegd:

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

vervolgens gewijzigd in

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

en het werkte


Antwoord 9

In mijn geval heb ik mijn klas ergens anders vandaan gekopieerd en merkte ik niet meteen dat het een abstractklas was. Je kunt abstracte klassen niet opblazen.


Antwoord 10

Wat je hier moet begrijpen, is dat:

De constructor ViewClassName(Context context, AttributeSet attrs )wordt aangeroepen bij het opblazen van de customView via xml.
U ziet dat u het nieuwe sleutelwoord niet gebruikt om uw object te instantiëren, d.w.z. u doet niet aan new GhostSurfaceCameraView(). Als u dit doet, roept u ude eerste constructor aan, d.w.z. public View (Context context).

Terwijl bij het opblazen van de weergave vanuit XML, dwz bij het gebruik van setContentView(R.layout.ghostviewscreen);of het gebruik van findViewById, jij, NEE, niet jij! , het Android-systeemroept de ViewClassName(Context context, AttributeSet attrs )constructor aan.

Dit is duidelijk bij het lezen van de documentatie: “Constructor die wordt aangeroepen bij het opblazen van een weergave vanuit XML.” Zie: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

Vergeet daarom nooit het basispolymorfisme en vergeet nooit de documentatie te lezen. Het scheelt een hoop hoofdpijn.

Other episodes