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

最近两天正在看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。

小欣慰一下,这也算自己为开源事业做了绵薄的贡献吧。

06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值