我正在尝试做这个愚蠢的“游戏”,我有一个相对的布局和从View扩展的类。我创建了视图,并希望使用Thread将它们添加到相对布局中。到目前一切尚好。我让它在小对象视图向下滚动相对布局的情况下工作得很好。然后,我又添加了两个用于选项的屏幕,只有在这些屏幕之后,我才想用滚动视图显示活动。问题是它停止工作,并出现以下错误:
08-03 20:13:48.140: E/AndroidRuntime(5152):java.lang.IllegalStateException:指定的子对象已经有父对象。您必须首先在子级的父级上调用removeView()。
我不能理解这个错误...
以下是启动线程和更新UI的函数的示例代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
context = this.getApplicationContext();
/*load all bitmaps*/
loadBitmaps();
/*get all the activities components*/
gameCanvasRL = (RelativeLayout)findViewById(R.id.gameCanvasRL);
playerScoreTV = (TextView)findViewById(R.id.playerPoints);
/*GameManager instance*/
manager = GameManager.getInstance();
/*Start Threads*/
startAllThreads();
}
private void startAllThreads() {
refreshCanvasHandler = new Handler();
spawnHandler = new Handler();
refreshCanvasThread = new Thread(new RefreshCanvasTask());
spawnTask = new Thread(new spawnTask());
refreshCanvasThread.start();
spawnTask.start();
}
class RefreshCanvasTask implements Runnable {
@Override
public void run() {
while(true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
refreshCanvasHandler.post(new Runnable() {
@Override
public void run() {
refreshCanvas();
}
});
}
}
}private void refreshCanvas() { int germSize;
/*Move all germs*/
manager.moveGerms();
germSize = manager.getGerms().size();
if(gameCanvasRL.getChildCount() > 0)
gameCanvasRL.removeAllViews();
for(int i = 0; i < germSize; i++) {
gameCanvasRL.addView(manager.getGerms().get(i));
}
}发布于 2014-08-04 03:23:51
该错误表示您正在尝试添加已添加到另一个视图中的视图。一个视图可能只有一个父级,因此第二次添加时会抛出异常。在将其添加到新父对象之前,您需要将其从原始父对象中删除。
https://stackoverflow.com/questions/25108213
复制相似问题