您的位置:首页 > 移动开发 > Android开发

Android源码Transition.java中发现一个小bug

2015-04-06 13:43 190 查看
最近两天正在看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。

小欣慰一下,这也算自己为开源事业做了绵薄的贡献吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐