web-dev-qa-db-ja.com

クラスを拡張する際の膨張のエラー

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

このエラーが発生する理由を誰か教えてもらえますか?ありがとう。

188
eccentricbiped

これがなぜ機能しなかったのかがわかったと思う2つのパラメーター「Context、AttributeSet」の場合にコンストラクターを提供する必要があるときに、1つのパラメーター「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();
        }
365
eccentricbiped

@Tim-両方のコンストラクターは不要で、ViewClassName(Context context, AttributeSet attrs )コンストラクターのみが必要です。何時間も何時間もの無駄な時間を過ごした後、私はこれを苦痛な方法で見つけました。

私はAndroid開発は非常に新しいですが、XMLファイルにカスタムViewクラスを追加しているため、いくつかの属性をインスタンス化時に処理する必要のあるXMLで。私よりもはるかに知識のある誰かが、この問題についてより明確な光を当てることができるでしょう。

45
KVNam

「Error inflating class」メッセージの別の考えられる原因は、XMLで指定されている完全なパッケージ名のつづりの間違いです。

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

Eclipse XMLエディターでレイアウトXMLファイルを開くと、この問題が強調表示されます。

19
rmtheis

Xmlに完全なクラスパスを記述することが重要です。サブクラスの名前のみが記述されている場合、「クラスを膨らませるエラー」が発生しました。

2
Mykola

fwiw、nullオブジェクトにアクセスしようとするコンストラクター内のカスタム初期化が原因でこのエラーを受け取りました。

1
Tom Howard

過去数時間、このエラーに悩まされていました。結局、カスタムビューライブラリをAndroid St​​udioのモジュールとして追加していましたが、アプリのbuild.gradleの依存関係として追加することを怠っていました。

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

私の場合、クラスを別の場所からコピーしましたが、abstractクラスであることにすぐには気付きませんでした。抽象クラスを膨らませることはできません。

0
IsaiahJ

私の場合、このような循環リソースを追加しました:

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

その後に変更されました

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

そしてそれは働いた

0
Evgenii Vorobei

TextEditの拡張と同じ問題がありました。私にとって間違いは、コンストラクタに「パブリック」を追加しないことでした。私の場合、引数ContextおよびAttributeSetを持つコンストラクターを1つだけ定義しても機能します。有線の問題は、APKを(歌われているかどうかに関係なく)ビルドし、それをデバイスに転送したときにのみバグが明らかになることです。アプリケーションがUSB接続デバイスでAndroidStudio-> RunAppを介して実行されると、アプリは動作します。

0
Nicola Mingotti