Ошибка раздувания при расширении класса
Я пытаюсь создать пользовательский вид 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 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
Может ли кто-нибудь сказать мне, почему я получаю эту ошибку? Спасибо.
Ответы
Ответ 1
Думаю, я понял, почему это не работает. Я предоставлял только конструктор для случая одного параметра "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();
}
Ответ 2
@Tim. Оба конструктора не требуются, необходим только конструктор ViewClassName (контекстный контекст, атрибут Attet). Я нашел это болезненным способом, после нескольких часов и часов впустую.
Я очень новичок в разработке Android, но здесь я думаю, что это связано с тем, что, поскольку мы добавляем пользовательский класс View в XML файл, мы устанавливаем ему несколько атрибутов в XML, которые необходимо обработать во время создания экземпляра. Кто-то гораздо более осведомленный, чем я, сможет пролить свет на этот вопрос.
Ответ 3
Еще одна возможная причина сообщения "Ошибка раздувания класса" может указывать на полное имя пакета, указанное в XML:
<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
Открытие XML файла вашего макета в редакторе XML Eclipse должно подчеркнуть эту проблему.
Ответ 4
Важно написать полный путь класса в xml.
Я получил "Ошибка раздувания класса", когда было записано только имя подкласса.
Ответ 5
У меня была эта ошибка, навязывающая меня последние несколько часов. Оказывается, я добавил пользовательский вид lib в качестве модуля в Android Studio, но я забыл добавить его как зависимость в приложении build.gradle
.
dependencies {
...
compile project(':gifview')
}
Ответ 6
У меня была та же проблема, что и расширение TextEdit. Для меня ошибка заключалась в том, что я не добавлял "public" к конструктору. В моем случае это работает, даже если я определяю только один конструктор, тот, у кого есть аргументы Context
и AttributeSet
. Проводная вещь заключается в том, что ошибка обнаруживается только тогда, когда я создаю APK (поет или нет), и я переношу его на устройства. Когда приложение запускается через AndroidStudio → RunApp на подключенном к USB устройстве, приложение работает.
Ответ 7
в моем случае я добавил такой циклический ресурс:
<drawable name="above_shadow">@drawable/above_shadow</drawable>
затем изменился на
<drawable name="some_name">@drawable/other_name</drawable>
и он работал
Ответ 8
fwiw, я получил эту ошибку из-за некоторой пользовательской инициализации внутри конструктора, пытающегося получить доступ к нулевому объекту.