3

안드로이드는 방법을 무시했다 I 팽창 클래스, 다음 치명적인 오류가 발생합니다. 응용 프로그램 만 작동합니다.이 재정의 된 함수를 제거합니다.않는 VirtualMachineError는

오류 :

09-18 13:45:43.809: E/AndroidRuntime(13363): FATAL EXCEPTION: main 
09-18 13:45:43.809: E/AndroidRuntime(13363): java.lang.VirtualMachineError 
09-18 13:45:43.809: E/AndroidRuntime(13363): at dalvik.system.DexFile.defineClass(Native Method) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:207) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:200) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.LayoutInflater.createView(LayoutInflater.java:471) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.LayoutInflater.inflate(LayoutInflater.java:386) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.view.View.inflate(View.java:8807) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.eee.android.activities.Screen1.addSubject(Screen1.java:372) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.xxx.android.activities.Screen1.parseData(Screen1.java:348) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.xxx.android.activities.Screen1.initalizeData(Screen1.java:178) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.xxx.android.activities.Screen1.onResume(Screen1.java:139) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.Activity.performResume(Activity.java:3832) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2114) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.os.Looper.loop(Looper.java:123) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at android.app.ActivityThread.main(ActivityThread.java:3687) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at java.lang.reflect.Method.invokeNative(Native Method) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at java.lang.reflect.Method.invoke(Method.java:507) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
09-18 13:45:43.809: E/AndroidRuntime(13363): at dalvik.system.NativeStart.main(Native Method) 

어떤 아이디어가?

편집 : 다른 방법으로 문제를 수정했습니다. 드로어 블 생성 코드를 다른 이벤트로 옮겼습니다. 하지만이 메서드를 재정의하려고하면 VirtualMachineError가 발생하는 이유는 무엇입니까?

업데이트 : MyButtonView으로 확장되면 동일한 오류가 발생합니다.

UPDATE :

내가 추가 메시지를 발견 : 마침내

09-19 09:24:43.789: W/dalvikvm(17401): Method Lcom/videoclasse/android/widgets/SubjectButton;.layout overrides final Landroid/view/View;.layout 
09-19 09:24:43.789: W/dalvikvm(17401): failed creating vtable 
09-19 09:24:43.789: W/dalvikvm(17401): Link of class 'Lcom/videoclasse/android/widgets/SubjectButton;' failed 

내가 안드로이드 2.3.3에서 발견. View.layout은 다음과 같이 정의되었습니다.

public final void layout(int l, int t, int r, int b) { 
    boolean changed = setFrame(l, t, r, b); 
    if (changed || (mPrivateFlags & LAYOUT_REQUIRED) == LAYOUT_REQUIRED) { 
     if (ViewDebug.TRACE_HIERARCHY) { 
      ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_LAYOUT); 
     } 

     onLayout(changed, l, t, r, b); 
     mPrivateFlags &= ~LAYOUT_REQUIRED; 
    } 
    mPrivateFlags &= ~FORCE_LAYOUT; 
} 

미안합니다.

+0

실제 코드를 게시 할 수 있습니까? 'Class MyButton'도 컴파일되지 않습니다 ... – WarrenFaith

+0

전체 코드 : http://pastebin.com/phpE6z4k – neworld

+1

'if (hasWindowFocus);가 위험한 오자 인 경우,';'는 if 조건을 끝내기 때문에 다시 그리기가됩니다. 항상 실행됩니다 ... 어쨌든'layout()'메소드를 제거하면이 에러가 발생하지 않습니까? – WarrenFaith

답변

2

안드로이드 2.3.3. View.layout은 final로 정의됩니다. 그러나 안드로이드 4.0에서이 기능은 더 이상 최종적인 것이 아닙니다. 4.0.0 빌더를 사용하고 있기 때문에이 오류가 발생합니다.

@WarrenFaith 덕분에 코드에서 잘못된 실수가 있었고, @ JesusFreke에게 주어진 방향에 대한 감사의 말로 감사합니다.

+0

버그 보고서 (https://code.google.com/p/dexmaker/issues/detail?id=9)도 참조하십시오. –