Sınıf genişletilirken hata oluşurken hata oluştu


188

GhostSurfaceCameraViewUzanan özel bir görünüm oluşturmaya çalışıyorum SurfaceView. İşte sınıf tanımlama dosyam

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

Ve bu benim ghostviewscreen.xml'de:

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

Şimdi yaptığım aktivitede:

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

Ne zaman setContentView()çağrılan, bir istisnası atılır:

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

Biri bana neden bu hatayı aldığımı söyleyebilir mi? Teşekkürler.

Yanıtlar:


369

Sanırım bunun neden işe yaramadığını anladım. Ben iki parametre 'Bağlam, AttributeSet' durumda için bir yapıcı sağlamalıydım zaman sadece bir parametre 'bağlam' durumunda bir yapıcı sağlıyordu. Ayrıca, yapıcılara genel erişim sağlamam gerekiyordu. İşte benim düzeltmem:

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

4
Bazen en basit şeyler bir sorun olabilir :) her iki parametrenin şişirmek için kullanıldığını bilmek güzel.
Warpzit

5
Teşekkür ederim!! Örneklerin hiçbir yerinde, tüm kurucuları aşırı yüklemenin gerekliliği hakkında herhangi bir söz bulamadım! Bana saatlerce (gün?) Zaman kazandın.
Scott Biggs

1
Çok teşekkürler! Hata mesajı oldukça belirsizdir, bu da beni bir an boğdu, hata mesajına nedeni (eksik yapıcı aşırı yüklemesi) eklemelilerdi.
AgentKnopf

1
Bunun için teşekkürler. Herkes bunun özel görünümler için tahta üzerinde gidip gitmediğini biliyor mu? özel görünüm yaptığınızda her iki kurucuyu da eklemeniz gerekir mi? (bağlam ve ardından bağlam ve öznitelikler)
Tim

2
O, daha önce görmeliydim! Mesaj View is not using the 2- **OR** 3-argument View constructorsbir tür yanıltıcı.
Saldırgan

45

@Tim - Her iki kurucu da gerekli değildir, yalnızca ViewClassName(Context context, AttributeSet attrs )kurucu gereklidir. Bunu saatlerce ve saatlerce boşa harcanan zamandan sonra acı verici bir şekilde buldum.

Android geliştirmede çok yeniyim, ancak burada ViewXML dosyasındaki özel sınıfı eklediğimizden , XML'de bunun için birkaç öznitelik ayarladığımızdan dolayı vahşi bir tahmin yapıyorum. örnekleme sırasında işlenecek. Benden çok daha bilgili biri bu konuda daha açık bir ışık tutabilecektir.


Bu mantıklı, benim xml içinde öznitelikleri tanımlarken benim özel TextView her zaman ViewClassName (Context bağlamı, AttributeSet attrs) ile inşa edilir. Ben xml dosyasında tanımlamak olmadan başlatırsanız, normal yapıcı yalnızca bağlam, ViewClassName (Context bağlam) ile çağrılır. Diğer kurucunun ne yaptığını merak ediyordum ve buna göre: stackoverflow.com/a/4022916/1505341 cevap, görünüm için bir temel stil ayarlamak için kullanılması gerekiyordu.
Kerem

19

"Sınıf şişirme hatası" iletisinin bir başka olası nedeni, XML'de belirtildiği yerde tam paket adını yanlış yazıyor olabilir:

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

Düzen XML dosyanızı Eclipse XML düzenleyicisinde açmak, bu sorunu vurgulamalıdır.


2
Bu gerçekten benim uygulama için düzeltme oldu. com.zerokol.views.joystickview com.zerokol.views.JoystickView Oldu Ve işe yaradı!
Andy

doğru. Yazım denetimi yapın veya IDE'niz tarafından sağlanan niyetleri kullanarak çalışmaya çalışın, sadece paket adınızı yazarak başlayın ve tüm availbale sınıflarınız niyetler altında gösterilir.
Khay

bu benim durumumdu.
Banee Ishaque K

2

Xml içine tam sınıf yol yazmak önemlidir. Yalnızca alt sınıfın adı yazıldığında 'Sınıfı şişirme hatası' aldım.


Bu @rmtheis'in önerdiğine çok benzer. Cevabını yorumlamak veya hatta ek bilgilerle düzenlemek daha iyi olabilir.
Ilia Barahovski

1

Son birkaç saattir beni rahatsız eden bu hatayla karşılaştım. Görünüşe göre, özel görünüm lib'ini Android Studio'da bir modül olarak ekledim, ancak uygulamayı uygulamalara bağımlılık olarak eklemeyi ihmal ettim build.gradle.

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

1

fwiw , boş bir nesneye erişmeye çalışan yapıcı içinde bazı özel başlatma nedeniyle bu hatayı aldım.


0

Bir TextEdit genişletme aynı sorun vardı. Benim için yanlış yapıcıya "kamu" eklemek değil oldu. Benim durumumda, yalnızca bir kurucu, argümanları olan Contextve AttributeSet. Kablolu şey, hatanın sadece bir APK oluşturduğumda (şarkı söyledim ya da değil) ve cihazlara aktardığımda ortaya çıkmasıdır. Uygulama, USB bağlantılı bir cihazda AndroidStudio -> RunApp ile çalıştırıldığında uygulama çalışır.


0

benim durumumda böyle bir döngüsel kaynak ekledi:

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

sonra olarak değiştirildi

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

ve işe yaradı


0

Benim durumumda, sınıfımı başka bir yerden kopyaladım ve hemen bir abstractsınıf olduğunu fark etmedim . Soyut sınıfları şişiremezsiniz.


0

Burada anlaşılması gereken şey şudur:

Yapıcı ViewClassName(Context context, AttributeSet attrs ), customView xml yoluyla şişirilirken çağrılır. Gördüğünüz gibi, nesnenizi somutlaştırmak için yeni anahtar kelimeyi kullanmıyorsunuz new GhostSurfaceCameraView(). Bunu yaptığınızda , ilk kurucu yanipublic View (Context context) .

Oysa XML'den görünümü şişirirken, yani kullanırken setContentView(R.layout.ghostviewscreen);veya kullanırken findViewById, siz, HAYIR, değil! , Robot sistemi çağrılarıViewClassName(Context context, AttributeSet attrs ) yapıcı .

Belgeleri okurken bu açıktır: "XML'den bir görünüm açılırken çağrılan yapıcı." Bkz. Https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

Bu nedenle, temel polimorfizmi asla unutmayınız ve belgeleri kullanarak okumayı asla unutmayınız. Bir ton baş ağrısından kurtarır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.