NoClassDefFoundError是因为OnLayoutChangeListener?

时间:2011-12-29 22:54:43

标签: android

我在理解以下事件时遇到问题,请帮忙。

我有一个带有菜单Activity的应用程序。在菜单中有一个按钮,按下时按钮启动一个计时器,完成时告诉菜单Activity它已经完成了。它通过使用我制作的界面来做到这一点。 Activity从按钮返回回调并通过Intent启动一个新的Activity。新活动包含多个视图,其中一个是AdView。以前用过这么好,但是......

现在我对布局进行了一些更改,我需要知道AdView何时更改其大小。为此,我向AdView添加了一个OnLayoutChangeListener,这就是问题所在。当包含AdView的新Activity启动时,我会收到有关我尝试创建的Activity类的NoClassDefFoundError。

我也注意到即使我实际上没有将监听器添加到AdView也会发生错误,这似乎只是因为Activity实现了OnLayoutChangeListener。

如果有任何帮助,Activity还会实现Runnable和OnClickListener,并且还使用多个Threads。现在,我不知道为什么其中任何一个都很重要,但确实如此。

只是为了记录,我重新启动了Eclipse并清理了项目。 请帮助任何人,我真的不明白这一点。

修改

开始游戏活动:

public void onSlideEnd(View v) {
    if (v == game){
        Intent i = new Intent();
        i.setClass(this, Game.class);
        startActivity(i);

        finish();
    }
}

游戏活动的OnCreate方法:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_game);
    setRequestedOrientation(1);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);

    layoutBase = (LinearLayout) findViewById(R.id.layoutBase);
    Drawable d = getResources().getDrawable(R.drawable.wood);
    layoutBase.setBackgroundDrawable(d);

    adView = (AdView) findViewById(R.id.adViewGame);
    adView.addOnLayoutChangeListener(this);

    layoutTop = (LinearLayout) findViewById(R.id.layoutTop);

    brickBox = new BrickBox(this);
    layoutBrick = (LinearLayout) findViewById(R.id.layoutBox);
    layoutBrick.addView(brickBox);
    brickBox.addOnLayoutChangeListener(this);

    goal = new GoalBox(this);
    LinearLayout layoutGoal = (LinearLayout) findViewById(R.id.layoutGoal);
    layoutGoal.addView(goal);
    goal.addOnLayoutChangeListener(this);

    restart = (Button) findViewById(R.id.buttonRestart);
    restart.setOnClickListener(this);

    start = (Button) findViewById(R.id.buttonStart);
    start.setOnClickListener(this);

    menu = (Button) findViewById(R.id.buttonMenu);
    menu.setOnClickListener(this);

    TextView time = (TextView) findViewById(R.id.textViewTime);
    TextView click = (TextView) findViewById(R.id.textViewClick);
    scoreBoard = new ScoreBoard(this, time, click);

    soundManager = new SoundManager(this);

    resizeLayouts();
}

崩溃代码:

01-01 13:27:05.537: E/AndroidRuntime(3781): FATAL EXCEPTION: Thread-9
01-01 13:27:05.537: E/AndroidRuntime(3781): java.lang.NoClassDefFoundError: com.martin.colorPuzzleFree.Game
01-01 13:27:05.537: E/AndroidRuntime(3781):     at com.martin.colorPuzzleFree.Menu.onSlideEnd(Menu.java:65)
01-01 13:27:05.537: E/AndroidRuntime(3781):     at com.martin.colorPuzzleFree.BrickButton.allertListenersEnd(BrickButton.java:258)
01-01 13:27:05.537: E/AndroidRuntime(3781):     at com.martin.colorPuzzleFree.BrickButton.run(BrickButton.java:243)
01-01 13:27:05.537: E/AndroidRuntime(3781):     at java.lang.Thread.run(Thread.java:1102)

我还注意到,这显示在Log on application start:

01-01 13:27:03.247: W/dalvikvm(3781): Link of class 'Lcom/martin/colorPuzzleFree/Game;' failed
01-01 13:27:03.257: E/dalvikvm(3781): Could not find class 'com.martin.colorPuzzleFree.Game', referenced from method com.martin.colorPuzzleFree.Menu.onSlideEnd
01-01 13:27:03.267: W/dalvikvm(3781): VFY: unable to resolve const-class 162 (Lcom/martin/colorPuzzleFree/Game;) in Lcom/martin/colorPuzzleFree/Menu;

1 个答案:

答案 0 :(得分:3)

我自己找到了答案。实际上非常明显,我正在测试的手机是运行Android 2.2,但OnLayoutChangeListener直到Android 3.0才实现。 Eclipse没有看到问题,因为AdView要求应用程序以Android 3.2为目标,其中包括OnLayoutChangeListener,但是当我的手机上启动了Activity时,它不知道如何处理界面并崩溃。我在运行Android 3.2的模拟器上测试了应用程序,但它运行良好。

结论,检查你的版本!