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
このエラーが発生する理由を誰か教えてもらえますか?ありがとう。
これがなぜ機能しなかったのかがわかったと思う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();
}
@Tim-両方のコンストラクターは不要で、ViewClassName(Context context, AttributeSet attrs )
コンストラクターのみが必要です。何時間も何時間もの無駄な時間を過ごした後、私はこれを苦痛な方法で見つけました。
私はAndroid開発は非常に新しいですが、XMLファイルにカスタムView
クラスを追加しているため、いくつかの属性をインスタンス化時に処理する必要のあるXMLで。私よりもはるかに知識のある誰かが、この問題についてより明確な光を当てることができるでしょう。
「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ファイルを開くと、この問題が強調表示されます。
Xmlに完全なクラスパスを記述することが重要です。サブクラスの名前のみが記述されている場合、「クラスを膨らませるエラー」が発生しました。
fwiw、nullオブジェクトにアクセスしようとするコンストラクター内のカスタム初期化が原因でこのエラーを受け取りました。
過去数時間、このエラーに悩まされていました。結局、カスタムビューライブラリをAndroid Studioのモジュールとして追加していましたが、アプリのbuild.gradle
の依存関係として追加することを怠っていました。
dependencies {
...
compile project(':gifview')
}
私の場合、クラスを別の場所からコピーしましたが、abstract
クラスであることにすぐには気付きませんでした。抽象クラスを膨らませることはできません。
私の場合、このような循環リソースを追加しました:
<drawable name="above_shadow">@drawable/above_shadow</drawable>
その後に変更されました
<drawable name="some_name">@drawable/other_name</drawable>
そしてそれは働いた
TextEditの拡張と同じ問題がありました。私にとって間違いは、コンストラクタに「パブリック」を追加しないことでした。私の場合、引数Context
およびAttributeSet
を持つコンストラクターを1つだけ定義しても機能します。有線の問題は、APKを(歌われているかどうかに関係なく)ビルドし、それをデバイスに転送したときにのみバグが明らかになることです。アプリケーションがUSB接続デバイスでAndroidStudio-> RunAppを介して実行されると、アプリは動作します。