1

何か大まかなことをしたと思います...あなたの考えを教えてください。

私はしばらくの間、Annotationsを使用するAndroid 用のインフラ プロジェクトを開発してきました。これは、いくつかのことを定義するために使用します。

次の注釈を見てください。コンパイルする必要がありますが、デバイスで実行すると、NoClassDefFoundException が発生します。

@Target({FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewIdentifier {

    int viewId() default -1;

    int[] viewIds() default {};

    ViewUI_Action[] listeners() default {};

    boolean forDev() default false;

}

これは実装です:

@SuppressWarnings("unused")
@ViewIdentifier(
        listeners = ViewUI_Action.OnClickAsCollection,
        viewIds = {R.id.AccelerometerEngineeringScreen, R.id.RotationVectorEngineeringScreen, R.id.NetworkEngineeringScreen,
                R.id.MagneticEngineeringScreen, R.id.OrientationEngineeringScreen, R.id.GPS_EngineeringScreen, R.id.CallsEngineeringScreen,
                R.id.UpgradeAppButton, R.id.DEV_Action_Button, R.id.FYI_Button})
private View[] modelViews; 

ViewIdentifier注釈を削除すると、コードがコンパイルされて正常に実行され、アプリが起動しますが、注釈を返すと NoClassDefFoundError が持続します。

これはクリーン ビルドの問題ではありません。これを投稿する前に非常に注意を払っていました。さらに、不足しているクラス ファイルがビン/クラスにあり、注釈を削除するとクリーン ビルドに関係なく機能します。ワークスペースを更新して再構築し、プロジェクトを閉じて開き、Eclipseを再起動し、その他のトリックを試みました。

最も奇妙なことは、注釈のパラメーターを逆にすると、たとえば.

@SuppressWarnings("unused")
@ViewIdentifier(
        viewIds = {R.id.AccelerometerEngineeringScreen, R.id.RotationVectorEngineeringScreen, R.id.NetworkEngineeringScreen,
                R.id.MagneticEngineeringScreen, R.id.OrientationEngineeringScreen, R.id.GPS_EngineeringScreen, R.id.CallsEngineeringScreen,
                R.id.UpgradeAppButton, R.id.DEV_Action_Button, R.id.FYI_Button},
        listeners = ViewUI_Action.OnClickAsCollection)
private View[] modelViews; 

次のような Eclipse エラーが表示されます。

ここに画像の説明を入力

また、Eclipse はこのフィールドを含むクラスを見つけることができません。

それで、あなたはどう思いますか?クラスのコンパイル中にエラーが発生しましたか?

アダム。

4

1 に答える 1

1

listenersサイズが1の配列であっても、フィールドには配列初期化構文があるようです。

それが役立つことを願っています:-)

于 2012-04-16T02:27:07.263 に答える