扩展类时出错错误

时间:2010-09-17 23:06:25

标签: java android xml class surfaceview

我正在尝试创建扩展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

有谁能告诉我为什么会收到此错误?感谢。

10 个答案:

答案 0 :(得分:364)

我想我弄清楚为什么这不起作用。当我应该为两个参数'Context,AttributeSet'的情况提供构造函数时,我只提供了一个参数'context'的构造函数。我还需要为构造函数提供公共访问权限。这是我的修复:

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

答案 1 :(得分:45)

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

我对Android开发很新,但我在这里做了一个疯狂的猜测,可能是因为我们在XML文件中添加自定义View类,因此我们设置了几个属性在XML中,它需要在实例化时进行处理。比我知识渊博的人能够更清楚地了解这件事。

答案 2 :(得分:19)

&#34;错误膨胀类的另一个可能原因&#34;消息可能拼写错误拼写在XML中指定的完整包名称:

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

在Eclipse XML编辑器中打开布局XML文件应突出显示此问题。

答案 3 :(得分:2)

在xml中编写完整的类路径很重要。 当只写了子类的名字时,我得到了'错误膨胀类'。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

fwiw ,由于构造函数中的某些自定义初始化尝试访问空对象,我收到此错误。

答案 6 :(得分:0)

我在扩展TextEdit时遇到了同样的问题。对我来说,错误是我没有向构造函数添加“public”。在我的情况下,即使我只定义了一个构造函数,即带有参数ContextAttributeSet的构造函数,它仍然有效。有线的事情是,只有当我构建一个APK(有罪或无法)并将其传输到设备时,该bug才会显示出来。当应用程序通过AndroidStudio运行时 - &gt;应用程序可以在USB连接的设备上运行。

答案 7 :(得分:0)

在我的情况下,我添加了这样的循环资源:

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

然后改为

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

并且有效

答案 8 :(得分:0)

在我的情况下,我从其他地方复制了我的课程,并没有立即注意到它是abstract课程。你无法夸大抽象类。

答案 9 :(得分:0)

这里要了解的是:

通过xml扩展customView时,调用构造函数ViewClassName(Context context, AttributeSet attrs )。 您会看到您没有使用new关键字来实例化您的对象,即您没有执行new GhostSurfaceCameraView()正在调用第一个构造函数,即public View (Context context)

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

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

因此,永远不要忘记基本的多态性,永远不要忘记阅读文档。可以节省很多头痛。