每次玩家移动我的游戏时,我都试图遍历RelativeLayout并删除所有视图(我的地图除外-它处理所有点击)。我发现使用 gameActivityRelativeLayout.removeAllViews(); 时,它将与ontouchevent代码混淆。我遍历每个子视图并将它们全部删除,但是还是以某种方式将它们都删除了。我进行了广泛的搜索,并尝试了许多方法,但无法弄清楚。
if (GameActivity.gameActivityRelativeLayout != null) {
activity_game.runOnUiThread(new Runnable() {
@Override
public void run() {
//remove all views except for mapImageView
for (int i = 0; i < GameActivity.gameActivityRelativeLayout.getChildCount(); i++){
View tmpView = GameActivity.gameActivityRelativeLayout.getChildAt(i);
if (!(tmpView instanceof MapImageView)){ //remove all views other than mapImageView
GameActivity.gameActivityRelativeLayout.removeViewAt(i);
}
}
Log.i("jay", "====Below view should only be mapImageView1====");
for (int i = 0; i < GameActivity.gameActivityRelativeLayout.getChildCount(); i++){
View tmpView = GameActivity.gameActivityRelativeLayout.getChildAt(i);
Log.i("jay", "View: " + tmpView + "tmpView.getTag(R.id.TAG_ID): " + tmpView.getTag(R.id.TAG_ID));
}
Log.i("jay", "====Above view should only be mapImageView1====");
//removing all and then readding mapImageView screwed up the ontouchevent code
//GameActivity.gameActivityRelativeLayout.removeAllViews();
//GameActivity.gameActivityRelativeLayout.addView(GameActivity.mapImageView);
//add all of the mob/npcs/enemy players/tradeskills/etc. to the screen
for (ImageView temp : MapImageView.tmpImageViewPool) {
if (temp.getParent() != GameActivity.gameActivityRelativeLayout){
temp.invalidate();
GameActivity.gameActivityRelativeLayout.addView(temp);
}
}
GameActivity.gameActivityRelativeLayout.invalidate();
GameActivity.mapImageView.invalidate();
}
});
}
这是我的日志文件,显示孩子并没有像应有的被全部删除。
I/jay: ====Below view should only be mapImageView1====
I/jay: View: com.kisnardonline.graphics.MapImageView{7f37236 V.ED..... ........ 0,0-1440,2392} tmpView.getTag(R.id.TAG_ID): mapImageView
I/jay: View: android.widget.ImageView{aab4871 V.ED..... ........ 0,0-112,112} tmpView.getTag(R.id.TAG_ID): res/images/object/object_gothic_window.png: 1112,1140
I/jay: View: android.widget.ImageView{3667656 V.ED..... ........ 0,0-112,112} tmpView.getTag(R.id.TAG_ID): res/images/object/object_gothic_window.png: 888,1476
I/jay: View: android.widget.ImageView{732c6d7 V.ED..... ........ 0,0-112,112} tmpView.getTag(R.id.TAG_ID): res/images/npc/npc_dev_arm.png: 888,916
I/jay: View: android.widget.ImageView{a7e5bc4 V.ED..... ........ 0,0-112,112} tmpView.getTag(R.id.TAG_ID): res/images/npc/npc_dev_itm.png: 776,1364
I/jay: View: android.widget.ImageView{55afaad V.ED..... ........ 0,0-45,45} tmpView.getTag(R.id.TAG_ID): null
I/jay: ====Above view should only be mapImageView1====
答案 0 :(得分:1)
原因是当我们开始这样删除时,子位置不是唯一的。删除位置0处的视图后,位置1处的视图即变为位置0。因此,一种方法
int count = GameActivity.gameActivityRelativeLayout.getChildCount();
while(count>1) {
for (int i = 0; i < GameActivity.gameActivityRelativeLayout.getChildCount(); i++){
View tmpView = GameActivity.gameActivityRelativeLayout.getChildAt(i);
if (!(tmpView instanceof MapImageView)) { //remove all views other than mapImageView
GameActivity.gameActivityRelativeLayout.removeViewAt(i);
}
}
count = GameActivity.gameActivityRelativeLayout.getChildCount();
}
答案 1 :(得分:0)
如果您希望迭代子项通过某些功能(例如,所有ImageView或带有某些标签的视图)删除其中的一些子项,请向后迭代:
for (int i = someParentLayout.getChildCount() - 1; i > -1; i--) {
View v = someParentLayout.getChildAt(i);
if (v instanceof ImageView) {
someParentLayout.removeViewAt(i);
}
}
在这种情况下,每次迭代后孩子的数量都会减少,但这不会影响您