我在理解以下事件时遇到问题,请帮忙。
我有一个带有菜单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;
答案 0 :(得分:3)
我自己找到了答案。实际上非常明显,我正在测试的手机是运行Android 2.2,但OnLayoutChangeListener直到Android 3.0才实现。 Eclipse没有看到问题,因为AdView要求应用程序以Android 3.2为目标,其中包括OnLayoutChangeListener,但是当我的手机上启动了Activity时,它不知道如何处理界面并崩溃。我在运行Android 3.2的模拟器上测试了应用程序,但它运行良好。
结论,检查你的版本!