layout / main.xml에서 내부 클래스보기를 참조하는 중 오류가 발생했습니다.
으으 ...
내 활동에서 내부 클래스로 뷰의 하위 클래스를 만듭니다. 내 활동에서이보기에 연결하기 전에
setContentView(new CustomView(this));
문제없이.
그러나 이제 내보기가 더 복잡 해져서 FrameLayout의 일부로 만들어 기본보기로 만들고 그 위에 Spinner 위젯을 추가 할 수 있습니다. 문제는 이렇게 할 때 오류가 발생한다는 것입니다.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.grafightscratch.ochemmer/com.grafightscratch.ochemmer.MoleculeTablet}: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
...
Caused by: android.view.InflateException: Binary XML file line #4: Error inflating class com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
...
Caused by: java.lang.ClassNotFoundException: com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView in loader dalvik.system.PathClassLoader@43b74a28
따라서이 뷰는 이전에 직접 연결했을 때 작동했지만 프레임 레이아웃의 일부로 main.xml 파일에 추가하려고 할 때 위의 오류가 발생했습니다. 또한 다음을 통해 표시되는 레이아웃에 넣어 보았습니다.
<com.grafightscratch.ochemmer.MoleculeTablet.MoleculeTabletView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/molecule_tablet_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
아무것도 작동하지 않습니다. InflateException / ClassNotFoundException 오류가 계속 발생합니다. 바이너리 XML 파일의 "line # 3"에 대해 불평하고 만약 그것이 main.xml에 대해 이야기하고 있다면 내가 세 번 확인한 패키지 선언입니다.
편집 나는이 뷰를 별도의 클래스 (즉 내부 클래스가 아님)로 만들려고 시도했으며 작동합니다. 주변을 둘러 본 후 xml 태그가 다음과 같아야한다는 게시물을 발견했습니다.
<com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView ...>
즉, 달러 기호를 사용하여 기본 클래스에서 내부 클래스를 구분해야합니다. 그러나 Eclipse는 이것에 대해 barfs, 오류라고 부르며 해당 문자로 빌드하거나 배포하는 것을 거부합니다. 이제 질문은 다음과 같습니다. 내부 클래스 인 뷰를 어떻게 참조합니까?
내부 클래스의 경우 구문은 다음과 같습니다.
<view class="com.grafightscratch.ochemmer.MoleculeTablet$MoleculeTabletView" />
그 이유는 $가 XML 태그에서 잘못된 문자이기 때문입니다.
나는 같은 문제를 겪고 있었다. 그러나 XML 파일의 구문은 정확했습니다.
결국 문제를 해결하게 된 것은 내부 클래스를 정적으로 선언해야한다는 것입니다. 예를 들면 :
public static class myWebView extends WebView
내부 클래스 :
<view class="{package}.{ParentClass}${innerClass}" />
내부 클래스의 경우 클래스를 선언해야합니다.
public static InnerClass
static
필요합니다.
<view xmlns:android="http://schemas.android.com/apk/res/android"
class="com.example.Myproject.Myactivity$Myview"
android:layout_width="fill_parent" android:id="@+id/name" android:visibility="visible" android:layout_gravity="bottom" android:layout_height="fill_parent" android:focusableInTouchMode="true"
/>
이 코드는 나를 위해 일했습니다. layout_width와 같은 요소 중 일부를 생략했을 때 프로그램이 충돌했습니다. 또한 작동하려면 뷰 클래스를 정적으로 만들어야했습니다. 결국 둥지에서 꺼내면 똑같 았을 것입니다. 안드로이드 노트 예제는 중첩 클래스를 사용합니다.
내부 클래스 내에서 사용자 지정보기를 만드는 몇 가지 핵심 사항은 다음과 같습니다.
public static class MainClass {
....
....
public class SubClassView extends LinearLayout {
public SubClassView(Context context, AttributeSet attrs) {
super(context, attrs);
.....
}
....
....
}
}
레이아웃은 다음과 같아야합니다.
<view class = ".MainClass$SubClassView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/button"/>
자바 클래스
- 정적 이 필요합니다
- AttributeSet이있는 생성자 가 필요합니다 (적어도 하나).
XML 파일
- view tag (with lower case NOT View) is required
- class tag with the path to your inner class, using
- $ instead of "." before your SubClassView name
You need to specify the fully qualified name of your view class in the XML for inflation to work and View Class to be found by the Runtime System.
Since you have declared your View as inner class of your activity the fully qualified name would be: <your_package_name>.OuterClassName.InnerClassName
Are you sure com.grafightscratch.ochemmer.CustomView
is the fully qualified name of your class?
EDIT: Thanks for reminding me of this. When the views are declared as nested classes there is a slight aberration, see Use Custom component of this document.
ReferenceURL : https://stackoverflow.com/questions/2098318/error-referencing-an-inner-class-view-in-layout-main-xml
'development' 카테고리의 다른 글
Django REST 프레임 워크에 사용자를 등록하는 방법은 무엇입니까? (0) | 2020.12.27 |
---|---|
새 Google Analytics 3.0 베타를 설치하려고 할 때 발생하는 링커 오류 (0) | 2020.12.27 |
사전 항목을 추가하거나 늘리는 방법은 무엇입니까? (0) | 2020.12.27 |
jQuery 자동 완성 : 애니메이션 GIF 로딩 이미지를 표시하는 방법 (0) | 2020.12.27 |
PHP 임의의 x 자리 숫자 (0) | 2020.12.27 |