扩展类时出现错误膨胀


188

我正在尝试创建一个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

谁能告诉我为什么会出现此错误?谢谢。

Answers:


369

我想我弄清楚了为什么这没用。当我应该为两个参数“ 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();
        }

4
有时,最简单的事情可能会成为问题:)很高兴知道这两个参数都用于膨胀。
Warpzit 2012年

5
谢谢!!在这些示例中,我无处提及重载所有构造函数的必要性!您节省了我数小时(几天?)的时间。
Scott Biggs

1
非常感谢!错误消息是非常具体的,这让我感到困惑,他们应该在错误消息中包括原因(缺少构造函数重载)。
AgentKnopf 2012年

1
谢谢你 有谁知道这是否适用于自定义视图?每当创建自定义视图时,都需要同时包括两个构造函数吗?(上下文,然后是上下文和属性)
Tim

2
哦,应该早点看!该消息View is not using the 2- **OR** 3-argument View constructors有点误导。
攻击性2014年

45

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

我对Android开发非常陌生,但我在这里做出了一个疯狂的猜测,这可能是由于以下事实:由于我们View在XML文件中添加了自定义类,因此我们在XML中为其设置了多个属性,这需要在实例化时要处理。不过,比我更有知识的人将能够在这个问题上更清楚地阐明。


这很有意义,当我在xml中为其定义属性时,我的自定义TextView总是使用ViewClassName(Context context,AttributeSet attrs)构造。如果我实例化它而不在xml文件中定义,则仅使用上下文ViewClassName(Context context)调用常规构造函数。我想知道其他构造函数的作用,并据此:stackoverflow.com/a/4022916/1505341答案,应该将其用于设置视图的基本样式。
凯雷姆2014年

19

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

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

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


2
这确实是我的应用程序的解决方案。com.zerokol.views.joystickview成为com.zerokol.views.JoystickView并且成功了!
安迪

真正。仔细检查拼写或尝试使用IDE提供的意图,只需输入包名开始,所有可用类都会显示在意图下。

这是我的情况。
Banee Ishaque K

2

在xml中编写完整的类路径很重要。当仅写入子类的名称时,出现“错误膨胀类”。


这与@rmtheis的建议非常相似。最好对他的答案进行评论,甚至用其他信息对其进行编辑。
伊利亚·巴拉荷夫斯基

1

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

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

1

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


0

我在扩展TextEdit时遇到了同样的问题。对我来说,错误是我没有向构造函数添加“ public”。就我而言,即使我仅定义一个构造函数(带有参数Context和的构造函数),它也可以工作AttributeSet。有线问题是,仅当我构建APK(不论是否选中)并将其传输到设备时,该错误才会显示出来。当通过USB连接的设备上的AndroidStudio-> RunApp运行该应用程序时,该应用程序将运行。


0

就我而言,我添加了这样的循环资源:

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

然后改为

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

而且有效


0

就我而言,我从其他地方复制了我的课程,没有立刻注意到这是一门abstract课程。您不能膨胀抽象类。


0

这里要了解的是:

ViewClassName(Context context, AttributeSet attrs )通过xml扩展customView时,将调用构造函数。您会看到您没有使用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)

因此,永远不要忘记基本的多态性,永远不要忘记阅读文档。它节省了大量的头痛。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.