移除子控件两种方式的区别

在正常情况下,移除一个view控件,通常都是先使用findViewById(int) 来获取该控件的实例,再调用它的setVisibility(int)的方法来隐藏或者移除该控件。但是如果ViewGroup中的子控件是动态的(或者说是没有指定id),那么要移除控件,就需要对父容器进行操作,移除的话有两种方式:

  1. 调用getChildAt(int)方法获取子控件对象,之后调用其setVisibility(View.GONE)方法,实现该功能
  2. 调用父容器的removeChildAt(int)方法,直接移除。

两者执行完的效果是一样的,但是本质上又有一定的区别。先举个小小的例子:

这里写图片描述
基本布局:最外层一个RelativeLayout,然后中间黄色的部分就是一个LinearLayout父容器,LinearLayout中间包含着3个子控件(分别为TextView,ImageView,Button),接下来在Java代码中移除中间ImageView控件。

1、使用removeViewAt(int)方法

mLinearLayout.removeViewAt(1);

结果如下:
这里写图片描述

2、使用getChildAt(int),获取子控件的方法:

mLinearLayout.getChildAt(1).setVisibility(View.GONE);

结果如下:
这里写图片描述
很显然使用两者产生的结果是一样的。

现在调用两次removeViewAt(int)方法,看看会有什么样的结果。

mLinearLayout.removeViewAt(1);
mLinearLayout.removeViewAt(1);

结果如下:
这里写图片描述
在LinearLayout中TextView,ImageView,Button的编号分别为0,1,2,所以当移除ImageView后,Button的index就会变为1。所以调用两次removeViewAt(int)方法,将移除ImageView和Button。

现在调用两次getChildAt(int)看看。

mLinearLayout.getChildAt(1).setVisibility(View.GONE);
mLinearLayout.getChildAt(1).setVisibility(View.GONE);

这里写图片描述
最终产生的结果却不一样,Button并没有被移除。

现在可以用一用Android SDK中提供的一个工具查看一下,UI检视器(hierarchy viewer)

hierarchy viewer UI检视器,获取ui实时信息,继承树
手机需要开启ViewServer才可以查看,普通商业手机不能查看,处于安全的因素,只有一些android开发机和虚拟机才可以查看
检验一台手机是否开启了View Server的办法为:
adb shell service call window 3
若返回值是:Result: Parcel(00000000 00000000 ‘……..’)” 说明View Server处于关闭状态
若返回值是:Result: Parcel(00000000 00000001 ‘……..’)” 说明View Server处于开启状态
若是一台可以打开View Server的手机(Android开发版手机 、模拟器or 按照本帖步骤给系统打补丁的手机),我们可以
使用以下命令打开View Server:
adb shell service call window 1 i32 4939
使用以下命令关闭View Server:
adb shell service call window 2 i32 4939

该工具位于Android SDK目录下的tools文件夹中
这里写图片描述

点开是长这样的
这里写图片描述

之后双击应用对应的包名,我这里测试应用的包名就是com.example.z9001_testmap
这里写图片描述

找到对应的父控件,点击对应的框框就可以预览。
这里写图片描述
这个工具的基本使用方法就介绍到这,回到正题。

当使用removeViewAt(int)方法移除一个子控件的时候,在UI检视器中的结果如图所示:
这里写图片描述
而使用getChildAt(int).setVisibility(View.GONE)方法,结果如图:
这里写图片描述

结论就很明显了,使用第一个方法,将彻彻底底地将子控件移除,而第二种移除的方法则有所不同。所以在使用两个方法的时候要注意,两者相同语句调用两次产生的结果是不一样的。


(当打开hierarchy viewer,黑框框提示该工具被遗弃了,取而代之的是Android Device Monitor sdk目录>>tools文件夹>>monitor.bat ,上次玩了一下,用起来更高端点,大家可以尝试一下这两个工具)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值