Ошибка надувания при расширении класса - PullRequest
188 голосов
/ 18 сентября 2010

Я пытаюсь создать пользовательское представление 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

Может кто-нибудь сказать мне, почему я получаю эту ошибку? Спасибо.

Ответы [ 9 ]

366 голосов
/ 18 сентября 2010

Кажется, я понял, почему это не работает.Я предоставлял конструктор только для случая с одним параметром context, когда я должен был предоставить конструктор для случая с двумя параметрами Context, AttributeSet.Мне также нужно было предоставить конструктору (-ам) публичный доступ.Вот мое исправление:

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();
        }
45 голосов
/ 15 апреля 2013

@ Tim - Оба конструктора не требуются, необходим только конструктор ViewClassName(Context context, AttributeSet attrs ). Я выяснил это болезненным способом, после нескольких часов потраченного времени.

Я очень новичок в разработке для Android, но я делаю дикое предположение, что это может быть связано с тем, что, поскольку мы добавляем пользовательский класс View в файл XML, мы устанавливаем для него несколько атрибутов в XML, который должен быть обработан во время создания экземпляра. Кто-то гораздо более знающий, чем я, сможет пролить более ясный свет на этот вопрос.

19 голосов
/ 17 ноября 2014

Другой возможной причиной появления сообщения «Error inflating class» может быть неправильное написание полного имени пакета, указанного в XML:

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

Открытие XML-файла макета в редакторе Eclipse XML должно выделить эту проблему.

2 голосов
/ 25 января 2017

Важно написать полный путь к классу в XML.Я получил сообщение «Ошибка надувания класса», когда в нем было написано только имя подкласса.

1 голос
/ 06 сентября 2017

fwiw , я получил эту ошибку из-за некоторой пользовательской инициализации в конструкторе, пытающейся получить доступ к нулевому объекту.

1 голос
/ 14 января 2016

Эта ошибка мучила меня последние несколько часов.Оказывается, я добавил пользовательскую библиотеку представлений в качестве модуля в Android Studio, но я не добавил ее в качестве зависимости в build.gradle.

dependencies {
    ...
    compile project(':gifview')
}
приложения.
0 голосов
/ 24 мая 2018

В моем случае я скопировал свой класс откуда-то еще и сразу не заметил, что это класс abstract. Вы не можете раздувать абстрактные классы.

0 голосов
/ 03 сентября 2017

в моем случае я добавил такой циклический ресурс:

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

, затем изменился на

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

, и он заработал

0 голосов
/ 19 апреля 2017

У меня была такая же проблема при расширении TextEdit.Для меня ошибка была в том, что я не добавил «public» в конструктор.В моем случае это работает, даже если я определяю только один конструктор с аргументами Context и AttributeSet.Дело в том, что ошибка проявляется только тогда, когда я создаю APK (опаленный или нет) и переносу его на устройства.Когда приложение запускается через AndroidStudio -> RunApp на устройстве, подключенном через USB, приложение работает.

...