最近两天正在看Scene+Transition部分,感觉这部分挺有空间可挖。该部分的功能是,在同一组ViewGroup结构的两个不同状态之间做动画切换,这有助于用户知道某一个状态的由来。更进一步,在这组ViewGroup结构中,可以选择部分view做动画切换,部分则不。这是个有趣的功能,所以写了小段代码测试。
选择view可以多个方法,比如直接指定view,通过view的id,名字,或种类。不幸的是,通过指定id来指定view的话,其中的remove方法始终出错,报告ArrayList越界。多次尝试后查阅该方法的源码,发现一个小bug。源码:
public Transition removeTarget(int targetId) {
if (targetId > 0) {
mTargetIds.remove(targetId);
}
return this;
}
其对应的add操作如下:
public Transition addTarget(int targetId) {
if (targetId > 0) {
mTargetIds.add(targetId);
}
return this;
}
在add方法中,int类型的targetId被自动转换为Integer类型,当成一个element加进了list。但是在remove方法中,参数是int类型时则对应ArrayList的remove(int position)方法,也即这个targetId被当成ArrayList的偏移量了,也即remove操作的是偏移量为targetI的的元素,而不是数值为targetId的那个元素,这显然不对。考虑到我们一般使用R.id.view_id这个参数来add和remove,故这个remove方法几乎必然越界。
查询Stackoverflow并google之后没有发现相关信息,于是在Android源码官网上提交了这个小bug:https://code.google.com/p/android/issues/detail?id=163184。由于这个bug简单清晰且对应到源码的具体方法了,所以半小时后即获得确认,状态由New变成Assigned。
小欣慰一下,这也算自己为开源事业做了绵薄的贡献吧。