扩展类时出现膨胀错误

我正在尝试创建一个扩展 SurfaceView的自定义视图 GhostSurfaceCameraView

返回文章页面

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

有人能告诉我为什么我会得到这个错误吗? 谢谢。

132066 次浏览

我想我知道为什么这样不行了。我只为一个参数“ 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();
}

@ Tim-两个构造函数都不是必需的,只需要 ViewClassName(Context context, AttributeSet attrs )构造函数。经过几个小时的浪费时间,我痛苦地发现了这一点。

我对 Android 开发非常陌生,但是我在这里大胆猜测,可能是因为我们在 XML 文件中添加了定制的 View类,所以我们在 XML 中为它设置了几个属性,这些属性需要在实例化时处理。不过,一个比我知识渊博得多的人将能够更清楚地阐明这个问题。

另一个可能导致“类膨胀错误”消息的原因可能是在 XML 中指定的完整包名称拼写错误:

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

在 EclipseXML 编辑器中打开布局 XML 文件应该会突出显示这个问题。

在过去的几个小时里,这个错误一直困扰着我。事实证明,我在 Android Studio 中将自定义视图库作为一个模块添加,但是我忽略了将它作为一个依赖项添加到应用程序的 build.gradle中。

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

在 xml 中编写完整的类路径非常重要。 当只有子类的名字被写入时,我得到了‘错误充气类’。

我在扩展 TextEdit 时遇到了同样的问题。对我来说,错误在于我没有将“ public”添加到构造函数中。在我的例子中,即使我只定义一个构造函数,即带有参数 ContextAttributeSet的构造函数,它也能工作。有线的事情是,只有当我建立一个 APK (烧伤或没有) ,我把它传输到设备时,错误才会显示自己。当应用程序通过 AndroidStudio-> RunApp 在 USB 连接的设备上运行时,应用程序就可以工作了。

在我的例子中,我添加了这样的循环资源:

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

然后变成了

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

成功了

Fwiw ,我收到了这个错误,这是由于构造函数中试图访问 null 对象的一些自定义初始化。

在我的例子中,我从其他地方复制了我的类,但没有马上注意到它是一个 abstract类。抽象类不能膨胀。

这里需要理解的是:

在通过 xml 对 customView 进行充气时调用构造函数 ViewClassName(Context context, AttributeSet attrs )。 您看到您没有使用 new 关键字来实例化您的对象,也就是说,您没有执行 new GhostSurfaceCameraView()。执行这个 将调用第一个构造函数,即 public View (Context context)

然而,当从 XML 扩展视图时,即使用 setContentView(R.layout.ghostviewscreen);或使用 findViewById时,不,不是你!机器人系统调用 ViewClassName(Context context, AttributeSet attrs )构造函数。

这一点在阅读文档时很明显: “从 XML 扩展视图时调用的构造函数”参见: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)

因此,永远不要忘记基本的多态性,也永远不要忘记阅读文档