เกิดข้อผิดพลาดในการขยายเมื่อขยายชั้นเรียน


188

ฉันพยายามที่จะสร้างมุมมองที่กำหนดเองที่ขยายGhostSurfaceCameraView SurfaceViewนี่คือไฟล์คำจำกัดความของชั้นเรียน

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

และนี่คือ ghostviewscreen.xml ของฉัน:

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

ตอนนี้ในกิจกรรมที่ฉันทำ:

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

เมื่อsetContentView()ได้รับการเรียกข้อยกเว้นจะถูกโยน:

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

ใครสามารถบอกฉันได้ว่าทำไมฉันถึงได้รับข้อผิดพลาดนี้? ขอบคุณ

คำตอบ:


369

ฉันคิดว่าฉันคิดว่าทำไมมันถึงไม่ทำงาน ฉันแค่สร้างคอนสตรัคเตอร์สำหรับกรณีของ 'บริบท' พารามิเตอร์เดียวเมื่อฉันควรจัดทำคอนสตรัคเตอร์สำหรับกรณี 'บริบท, ชุดแอตทริบิวต์ Attribute' สองพารามิเตอร์ ฉันต้องให้สิทธิ์การเข้าถึงแก่ผู้สร้างด้วย นี่คือการแก้ไขของฉัน:

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
บางครั้งสิ่งที่ง่ายที่สุดอาจเป็นปัญหา :) ดีที่จะรู้ว่าพารามิเตอร์ทั้งสองถูกใช้เพื่อขยาย
Warpzit

5
ขอบคุณ!! ไม่มีที่ไหนในตัวอย่างที่ฉันสามารถหาพูดถึงเกี่ยวกับความจำเป็นของการบรรทุกเกินพิกัดทั้งหมด! คุณประหยัดเวลาได้หลายชั่วโมง (วัน?)
Scott Biggs

1
ขอบคุณมาก! ข้อความแสดงข้อผิดพลาดค่อนข้างไม่เจาะจงซึ่งทำให้ฉันนิ่งงันสักครู่พวกเขาควรจะรวมถึงเหตุผล (คอนสตรัคเตอร์เกินพิกัดหายไป) ในข้อความแสดงข้อผิดพลาด
AgentKnopf

1
ขอบคุณสำหรับสิ่งนี้. ไม่มีใครรู้ว่าสิ่งนี้ไปทั่วกระดานสำหรับมุมมองที่กำหนดเอง? คุณต้องรวมทั้งคอนสตรัคเตอร์ทุกครั้งที่คุณสร้างมุมมองที่กำหนดเอง (บริบทแล้วบริบทและคุณลักษณะ)
ทิม

2
โอ้น่าจะเห็นมันเร็วกว่านี้แล้ว! ข้อความView is not using the 2- **OR** 3-argument View constructorsเป็นประเภทที่ทำให้เข้าใจผิด
Attacktive

45

@Tim - ไม่จำเป็นต้องใช้ทั้งตัวViewClassName(Context context, AttributeSet attrs )สร้าง ฉันพบสิ่งนี้ด้วยวิธีที่เจ็บปวดหลังจากเวลาผ่านไปหลายชั่วโมง

ฉันใหม่มากสำหรับการพัฒนา Android แต่ฉันคาดเดาได้ยากเนื่องจากอาจเพิ่มViewคลาสที่กำหนดเองในไฟล์ XML เรากำลังตั้งค่าคุณลักษณะหลายอย่างใน XML ซึ่งต้องการ ที่จะดำเนินการในช่วงเวลาของการเริ่มต้น คนที่มีความรู้มากกว่าฉันจะสามารถเปิดเผยแสงที่ชัดเจนในเรื่องนี้ได้


สิ่งนี้เหมาะสมแล้ว TextView แบบกำหนดเองของฉันจะถูกสร้างด้วย ViewClassName (บริบทบริบท AttributeSet attrs) เสมอเมื่อฉันกำหนดแอตทริบิวต์สำหรับใน XML หากฉันสร้างอินสแตนซ์โดยไม่ต้องกำหนดในไฟล์ xml คอนสตรัคปกติจะถูกเรียกด้วยบริบทเท่านั้น ViewClassName (บริบทบริบท) ฉันสงสัยว่าตัวสร้างอื่นทำอะไรและตามนี้: stackoverflow.com/a/4022916/1505341คำตอบมันควรจะใช้สำหรับการตั้งค่าสไตล์ฐานสำหรับมุมมอง
Kerem

19

สาเหตุที่เป็นไปได้อีกประการหนึ่งของข้อความ "ข้อผิดพลาดการขยายชั้น" อาจเป็นการสะกดชื่อแพ็กเกจแบบเต็มซึ่งระบุไว้ใน XML:

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

การเปิดไฟล์ XML โครงร่างของคุณใน Eclipse XML editor ควรเน้นปัญหานี้


2
นี่เป็นการแก้ไขสำหรับแอปพลิเคชันของฉัน com.zerokol.views.joystickview กลายเป็น com.zerokol.views.JoystickView และมันใช้งานได้!
Andy

จริง ตรวจสอบการสะกดคำซ้ำหรือพยายามทำงานโดยใช้ความตั้งใจที่มีให้โดย IDE ของคุณเพียงแค่เริ่มต้นด้วยการพิมพ์ชื่อแพ็กเกจของคุณและคลาส availbale ทั้งหมดของคุณจะแสดงภายใต้ความตั้งใจ
Khay

นี่เป็นกรณีของฉัน
Banee Ishaque K

2

เป็นสิ่งสำคัญที่จะต้องเขียนเส้นทางแบบเต็มใน xml ฉันได้รับ 'ข้อผิดพลาดพองตัวคลาส' เมื่อเขียนชื่อคลาสย่อยเท่านั้น


นี่คล้ายกับสิ่งที่ @rmtheis แนะนำ อาจดีกว่าที่จะแสดงความคิดเห็นคำตอบของเขาหรือแม้กระทั่งแก้ไขด้วยข้อมูลเพิ่มเติม
Ilia Barahovski

1

ฉันพบข้อผิดพลาดนี้รบกวนฉันในไม่กี่ชั่วโมงที่ผ่านมา กลายเป็นว่าฉันได้เพิ่ม lib มุมมองที่กำหนดเองเป็นโมดูลใน Android Studio แต่ฉันไม่ได้สนใจที่จะเพิ่มมันเป็นการพึ่งพาของแอbuild.gradle

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

1

fwiwฉันได้รับข้อผิดพลาดนี้เนื่องจากการเริ่มต้นที่กำหนดเองภายในตัวสร้างที่พยายามเข้าถึงวัตถุที่เป็นโมฆะ


0

ฉันมีปัญหาเดียวกันกับการขยาย TextEdit สำหรับฉันความผิดพลาดคือฉันไม่ได้เพิ่ม "สาธารณะ" ให้กับผู้สร้าง ในกรณีของฉันมันทำงานแม้ว่าผมจะกำหนดเพียงหนึ่งคอนสตรัคหนึ่งที่มีการขัดแย้งและContext AttributeSetสิ่งที่มีสายคือข้อผิดพลาดที่เปิดเผยตัวเองเฉพาะเมื่อฉันสร้าง APK (ร้องหรือไม่) และฉันถ่ายโอนไปยังอุปกรณ์ เมื่อแอปพลิเคชันทำงานผ่าน AndroidStudio -> RunApp บนอุปกรณ์ที่เชื่อมต่อ USB แอปจะทำงาน


0

ในกรณีของฉันฉันเพิ่มทรัพยากรวงจรดังกล่าว:

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

จากนั้นเปลี่ยนเป็น

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

และมันก็ใช้งานได้


0

ในกรณีของฉันฉันคัดลอกชั้นเรียนของฉันจากที่อื่นและไม่ได้สังเกตทันทีว่าเป็นabstractชั้นเรียน คุณไม่สามารถขยายคลาสนามธรรมได้


0

สิ่งที่ต้องทำความเข้าใจที่นี่คือ:

ตัวสร้างViewClassName(Context context, AttributeSet attrs )ถูกเรียกใช้เมื่อขยาย customView ผ่าน xml new GhostSurfaceCameraView()คุณจะเห็นคุณไม่ได้ใช้คำหลักใหม่ที่จะยกตัวอย่างวัตถุของคุณคือคุณไม่ได้ทำ การทำเช่นนี้คุณpublic View (Context context)จะเรียกเช่นคอนสตรัคครั้งแรก

ในขณะที่ขยายมุมมองจาก XML เช่นเมื่อใช้setContentView(R.layout.ghostviewscreen);หรือใช้findViewByIdคุณไม่ใช่ไม่ใช่คุณ! , ระบบหุ่นยนต์เรียกViewClassName(Context context, AttributeSet attrs )constructor

สิ่งนี้ชัดเจนเมื่ออ่านเอกสาร: "ตัวสร้างที่ถูกเรียกเมื่อขยายมุมมองจาก XML" ดู: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

ดังนั้นอย่าลืมความแตกต่างพื้นฐานและอย่าลืมอ่านเอกสาร ช่วยลดอาการปวดหัวได้หนึ่งตัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.