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


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

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

回答:


369

これがうまくいかなかった理由がわかったと思います。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();
        }

4
場合によっては、最も単純なことが問題になることがあります:)両方のパラメータが膨張に使用されていることを知っておくと役に立ちます。
Warpzit

5
ありがとうございました!!例のどこにも、すべてのコンストラクターをオーバーロードする必要性についての言及はありませんでした!時間(日?)節約できました。
Scott Biggs

1
どうもありがとう!エラーメッセージはかなり具体的ではありません。少し困惑しましたが、エラーメッセージに理由(コンストラクターのオーバーロードがない)が含まれているはずです。
AgentKnopf

1
これをありがとう。これがカスタムビューの全体に及ぶかどうか誰かが知っていますか?カスタムビューを作成するときは常に両方のコンストラクタを含める必要がありますか?(コンテキスト、次にコンテキストと属性)
Tim

2
O、もっと早く見た方がいいよ!メッセージ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が提供する意図を使用して作業してみてください。パッケージ名を入力するだけで開始すると、すべてのアベイルズクラスが意図の下に表示されます。
Khay

これは私のケースでした。
Banee Ishaque K 2017

2

xmlに完全なクラスパスを記述することが重要です。サブクラスの名前のみが書き込まれたときに「エラーインフレートクラス」が表示されました。


これは、@ rmtheisが提案しているものと非常によく似ています。おそらく彼の回答にコメントするか、追加情報で編集する方が良いでしょう。
Ilia Barahovski 2017年

1

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

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

1

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


0

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


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 GhostSurfaceCameraView()。これ行うと、最初のコンストラクターieが呼び出されます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)

したがって、基本的なポリモーフィズムを忘れたり、ドキュメントを一読することを忘れないでください。それは頭痛のトンを節約します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.