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。
小欣慰一下,这也算自己为开源事业做了绵薄的贡献吧。
选择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。
小欣慰一下,这也算自己为开源事业做了绵薄的贡献吧。
相关文章推荐
- Java源码中的发现:快速判断一个int值是几位数
- Android开发_分享一个的bug解决方案R.java was modified manually! Reverting to generated version!
- 发现了Android RadioGroup的一个Bug
- 发现了Android RadioGroup的一个Bug
- 发现一个微信(android版)的选择图片时的BUG
- Android4.2.2 Gallery2源码分析(2)——发现Gallery.java
- android 命令行的一个bug 之:android Usage: java [-options] class [args...]
- 通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2为何View需要layout两次;以及发现Android的一个小bug
- 如何在Android源码编译系统中添加一个Java项目
- 最近读openfire源码发现一个bug
- Android4.2.2 Gallery2源码分析(2)——发现Gallery.java
- 【Android源码阅读系列一】一个bug引发的血案:阅读Android源码 MeasureSpec类(API版本:23)
- java.lang.NoClassDefFoundError: android/os/PersistableBundle 解决一个你难以发现的报错
- 滴滴国际化项目 Android 端演进 2017-12-01 Java和Android架构 热文导读 | 点击标题阅读 厉害了!如何Python写一个安卓APP,附源码! 吊炸天!74款APP完
- 一个android dex 转java源码工具
- Android4.2.2 Gallery2源码分析(2)——发现Gallery.java
- 通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2为何View需要layout两次;以及发现Android的一个小bug
- 发现了一个腾讯微博代码BasicAPI .java的里面的一个很低级bug,居然用==比较字符串
- 发现java.io.File中 list()方法的一个bug
- 传智播客JAVA培训——又发现一个Android的论坛