수업 연장시 팽창 오류


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

왜 이것이 작동하지 않는지 알았습니다. 두 개의 매개 변수 '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 2019

5
감사합니다!! 예제에서 나는 모든 생성자를 오버로드해야 할 필요성에 대한 언급을 찾을 수 없었습니다! 시간을 절약했습니다.
Scott Biggs

1
고마워요! 오류 메시지는 매우 구체적이지 않으므로 잠시 동안 문제가 발생했습니다. 오류 메시지에 이유 (생성자 과부하 누락)가 포함되어 있어야합니다.
Agent Knopf

1
이것에 감사합니다. 사용자 정의보기를 위해 이것이 보드를 가로 지르는 지 아는 사람이 있습니까? 사용자 정의보기를 만들 때마다 두 생성자를 모두 포함해야합니까? (문맥, 그리고 문맥과 속성)
Tim

2
O, 더 일찍 보았어야 했어요! 메시지 View is not using the 2- **OR** 3-argument View constructors는 오해의 소지가 있습니다.
공격적인

45

@Tim-두 생성자 모두 필요하지 않으며 ViewClassName(Context context, AttributeSet attrs )생성자 만 필요합니다. 나는 몇 시간과 몇 시간을 낭비한 후에 고통스러운 방법을 발견했습니다.

나는 안드로이드 개발에 익숙하지 않지만 여기서 ViewXML 파일에 커스텀 클래스를 추가하고 있기 때문에 XML에서 몇 가지 속성을 설정 하고 있다는 사실 때문에 아마 추측 할 것이다. 인스턴스화시 처리됩니다. 나보다 훨씬 더 많은 지식을 가진 사람이이 문제에 대해 더 명확한 빛을 비출 수있을 것입니다.


이것은 XML에서 속성을 정의 할 때 사용자 정의 TextView가 항상 ViewClassName (Context context, AttributeSet attrs)으로 구성되는 것이 의미가 있습니다. xml 파일에서 정의하지 않고 인스턴스화하면 일반 생성자가 컨텍스트 ViewClassName (Context context)로만 호출됩니다. 다른 생성자가하는 일이 궁금합니다. stackoverflow.com/a/4022916/1505341 답변에 따르면 뷰의 기본 스타일을 설정하는 데 사용됩니다.
Kerem

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가되었습니다.
Andy

진실. IDE에서 제공하는 의도를 사용하여 철자를 다시 확인하거나 작업을 시도하십시오. 패키지 이름을 입력하여 시작하면 모든 availbale 클래스가 의도 아래에 표시됩니다.
Khay

이것이 나의 경우였다.
Banee Ishaque K

2

xml에 전체 클래스 경로를 작성하는 것이 중요합니다. 하위 클래스의 이름 만 쓰면 '클래스 팽창 중 오류'가 발생했습니다.


이것은 @rmtheis가 제안하는 것과 매우 유사합니다. 그의 답변에 댓글을 달거나 추가 정보로 수정하는 것이 좋습니다.
Ilia Barahovski

1

지난 몇 시간 동안이 오류가 발생했습니다. Android Studio에서 사용자 정의보기 라이브러리를 모듈로 추가했지만 app의 종속성으로 추가하지는 않았습니다 build.gradle.

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

1

fwiw , 생성자 내에서 null 객체에 액세스하려는 일부 사용자 지정 초기화로 인해이 오류가 발생했습니다.


0

TextEdit을 확장하는 것과 같은 문제가있었습니다. 나를 위해 실수는 생성자에 "공개"를 추가하지 않았다는 것입니다. 내 경우에는 내가 단 하나의 생성자 인수를 사용하여 하나의 정의 경우에도 작동 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 GhostSurfaceCameraView()있습니다. 이렇게 당신은 첫 번째 생성자의 예를 요구하고있다 public View (Context context).

XML에서보기를 팽창 할 때 반면, 즉 사용하는 경우 setContentView(R.layout.ghostviewscreen);또는 사용하여 findViewById, 당신을, 아니, 당신! , 안드로이드 시스템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.