3

Android は致命的なエラーをスローし、メソッドをオーバーライドしたクラスを拡張します。

Class MyButton extends Button {
    ....
    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l, t, r, b);
    }
}

コードにコメントを付けるかどうかは関係ありません。アプリケーションは、このオーバーライドされた関数を削除するだけで機能します。

エラー:

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 が発生するのかということです。

更新:MyButtonから拡張するViewと、同じエラーが発生しました。

アップデート:

追加のメッセージが見つかりました:

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;
}

愚かな質問で申し訳ありません。

4

1 に答える 1

2

アンドロイド2.3.3で。View.layoutファイナルと定義されています。しかし、Android 4.0 では、この関数は最終的なものではなくなりました。このエラーが発生した理由は、4.0.0 ビルダーを使用しているためです。

コードのミスタイプを見つけてくれた@WarrenFaithに感謝し、詳細を検索する指示を与えてくれた@JesusFrekeに感謝します。

于 2012-09-19T06:44:55.060 に答える