Android RemoveViewAt不会删除每个视图

时间:2019-02-13 05:14:00

标签: android view

每次玩家移动我的游戏时,我都试图遍历Rel​​ativeLayout并删除所有视图(我的地图除外-它处理所有点击)。我发现使用 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====

2 个答案:

答案 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);
        }
    }

在这种情况下,每次迭代后孩子的数量都会减少,但这不会影响您