Lỗi tăng cao khi mở rộng một lớp


188

Tôi đang cố gắng tạo một chế độ xem tùy chỉnh GhostSurfaceCameraViewmở rộng SurfaceView. Đây là tập tin định nghĩa lớp học của tôi

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

Và đây là trong ghostviewscreen.xml của tôi:

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

Bây giờ trong hoạt động tôi đã thực hiện:

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

Khi setContentView()được gọi, một ngoại lệ được đưa ra:

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

Bất cứ ai có thể cho tôi biết tại sao tôi nhận được lỗi này? Cảm ơn.

Câu trả lời:


369

Tôi nghĩ rằng tôi đã tìm ra lý do tại sao điều này không hoạt động. Tôi chỉ cung cấp một hàm tạo cho trường hợp một tham số 'bối cảnh' khi tôi nên cung cấp một hàm tạo cho hai tham số 'Trường hợp bối cảnh, thuộc tính'. Tôi cũng cần phải cung cấp cho các nhà xây dựng truy cập công khai. Đây là cách khắc phục của tôi:

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
Đôi khi những điều đơn giản nhất có thể là một vấn đề :) tốt để biết rằng cả hai tham số được sử dụng để tăng cao.
Warpzit

5
Cảm ơn bạn!! Không ở đâu trong các ví dụ tôi có thể tìm thấy bất kỳ đề cập nào về sự cần thiết của quá tải tất cả các nhà xây dựng! Bạn đã tiết kiệm cho tôi hàng giờ (ngày?) Thời gian.
Scott Biggie

1
Cảm ơn rất nhiều! Thông báo lỗi khá không đặc biệt, khiến tôi bối rối trong giây lát, đáng lẽ họ phải đưa lý do (thiếu quá trình xây dựng) vào thông báo lỗi của họ.
Đặc vụKnopf

1
cảm ơn vì điều đó. Có ai biết nếu điều này đi qua bảng cho quan điểm tùy chỉnh? bạn cần bao gồm cả hai hàm tạo bất cứ khi nào bạn tạo chế độ xem tùy chỉnh? (bối cảnh, sau đó là bối cảnh và thuộc tính)
Tim

2
O, nên xem nó sớm hơn! Tin nhắn View is not using the 2- **OR** 3-argument View constructorslà loại gây hiểu lầm.
Tấn công

45

@Tim - Cả hai hàm tạo đều không bắt buộc, chỉ ViewClassName(Context context, AttributeSet attrs )cần hàm tạo. Tôi tìm thấy điều này một cách đau đớn, sau nhiều giờ lãng phí thời gian.

Tôi rất mới đối với sự phát triển của Android, nhưng tôi đang đoán một cách hoang dã ở đây, rằng có thể do thực tế là vì chúng tôi đang thêm Viewlớp tùy chỉnh trong tệp XML, nên chúng tôi đang đặt một số thuộc tính cho nó trong XML, cần được xử lý tại thời điểm khởi tạo. Một người hiểu biết hơn tôi sẽ có thể làm sáng tỏ vấn đề này hơn.


Điều này có ý nghĩa, TextView tùy chỉnh của tôi luôn được xây dựng với ViewClassName (bối cảnh bối cảnh, Attribution Set Attrs) khi tôi xác định các thuộc tính cho nó trong xml. Nếu tôi khởi tạo nó mà không xác định trong tệp xml, hàm tạo thông thường sẽ được gọi chỉ với ngữ cảnh, ViewClassName (Ngữ cảnh ngữ cảnh). Tôi đã tự hỏi những gì các nhà xây dựng khác làm và theo điều này: stackoverflow.com/a/4022916/1505341 câu trả lời, nó được sử dụng để thiết lập một kiểu cơ sở cho khung nhìn.
Kerem

19

Một nguyên nhân có thể khác của thông báo "Lớp lạm phát lỗi" có thể sai chính tả tên gói đầy đủ trong đó được chỉ định trong XML:

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

Mở tệp XML bố trí của bạn trong trình soạn thảo XML Eclipse sẽ làm nổi bật vấn đề này.


2
Đây thực sự là bản sửa lỗi cho ứng dụng của tôi. com.zerokol.view.joystickview Trở thành com.zerokol.view.JoystickView Và nó đã hoạt động!
Andy

thật. Kiểm tra chính tả hoặc thử làm việc bằng cách sử dụng các ý định do IDE của bạn cung cấp, chỉ cần bắt đầu bằng cách nhập tên gói của bạn và tất cả các lớp availbale của bạn sẽ được hiển thị theo ý định.
Khay

đây là trường hợp của tôi
Banee Ishaque K

2

Điều quan trọng là viết đường dẫn lớp đầy đủ trong xml. Tôi đã nhận được 'Lỗi thổi phồng lớp' khi chỉ có tên của lớp con được viết.


Điều này rất giống với những gì @rmtheis đang đề xuất. Có thể tốt hơn để bình luận câu trả lời của anh ấy hoặc thậm chí chỉnh sửa nó với thông tin bổ sung.
Ilia Barahovski

1

Tôi đã có lỗi này làm tôi khó chịu trong vài giờ qua. Hóa ra, tôi đã thêm lib xem tùy chỉnh dưới dạng mô-đun trong Android Studio, nhưng tôi đã bỏ qua việc thêm nó dưới dạng phụ thuộc trong ứng dụng build.gradle.

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

1

fwiw , tôi đã nhận được lỗi này do một số khởi tạo tùy chỉnh trong hàm tạo cố gắng truy cập một đối tượng null.


0

Tôi gặp vấn đề tương tự khi mở rộng TextEdit. Đối với tôi, lỗi là tôi đã không thêm "công khai" vào hàm tạo. Trong trường hợp của tôi, nó hoạt động ngay cả khi tôi chỉ xác định một hàm tạo, một hàm có đối số ContextAttributeSet. Điều có dây là lỗi chỉ xuất hiện khi tôi xây dựng APK (hát hay không) và tôi chuyển nó sang thiết bị. Khi ứng dụng được chạy qua AndroidStudio -> RunApp trên thiết bị được kết nối USB, ứng dụng sẽ hoạt động.


0

trong trường hợp của tôi, tôi đã thêm tài nguyên tuần hoàn như vậy:

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

sau đó đổi thành

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

va no đa hoạt động


0

Trong trường hợp của tôi, tôi đã sao chép lớp của mình từ một nơi khác và không nhận thấy ngay rằng đó là một abstractlớp. Bạn không thể thổi phồng các lớp trừu tượng.


0

Điều cần hiểu ở đây là:

Hàm tạo ViewClassName(Context context, AttributeSet attrs )được gọi khi thổi phồng customView qua xml. Bạn thấy bạn không sử dụng từ khóa mới để khởi tạo đối tượng của bạn tức là bạn không làm new GhostSurfaceCameraView(). Làm điều này bạn đang gọi hàm tạo đầu tiên tức là public View (Context context).

Trong khi đó, khi xem tăng từ XML, tức là khi sử dụng setContentView(R.layout.ghostviewscreen);hoặc sử dụng findViewById, bạn, KHÔNG, không phải bạn! , hệ thống Android gọi hàm ViewClassName(Context context, AttributeSet attrs )tạo.

Điều này là rõ ràng khi đọc tài liệu: "Trình xây dựng được gọi khi thổi phồng một khung nhìn từ XML." Xem: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.Attributionset)

Do đó, không bao giờ quên đa hình cơ bản và không bao giờ quên đọc qua tài liệu. Nó tiết kiệm được một tấn đau đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.