android复选框取消键无效的漏洞

以下代码可以创建一个简便的复选框。


boolean[] isCheckCache = new boolean[5];

String[] nameStrings = {"选项1","选项2","选项3","选项4","选项5",};

new AlertDialog.Builder(getActivity())

.setTitle("复选框")
.setMultiChoiceItems(nameStrings, isCheckCache, new MyonMultiChoiceClickListener())
.setPositiveButton("确定", new MyDiaglogOnClickPositiveListener())
.setNegativeButton("取消", new MyDiaglogOnClickNegativeListener())

.show();


其中,isCheckCache[]是一个boolean[],用来记录各个选项的值。

只要你点击了这个多选框的选项,isCheck[which]就会改变值---这些操作是固定的,一定会执行。无论你的监听器MyonMultiChoiceClickListener()是否为Null,监听器的代码写了什么。

关于这点,我查了很久,实在查不到这些操作的源头在哪,但应该是在源码里,具体应该是AlertController里。


这样一来,确定键就没用了,因为无论我是否点击确定键,只要点击了选项,就会改变值。取消键同时也没了作用,没办法去取消做过的操作。

仔细一想,就会发现,少了一个值,一个缓存值,操作的应该是缓存值,最后再把缓存值赋予给真的boolean[]数组里才对。那样的话,如果我要取消这个操作直接就不把缓存存过去就好了。

缓存boolean[]  就叫 isCheckCache[],真正要保存的boolean[ ]就叫 isCheck[] 。


接下来,让我们试想一下,我点击了第一个选项,但是我按了取消,情况会怎样?

isCheckCache[0] =true ;

isCheck[0] = false; 

对吧?

然后我再点开这个多选框,显示的不是isCheck[],而是isCheckCache[],第一个选项已经打勾了。

因为setMultiChoiceItems(nameStrings, isCheckCache, new MyonMultiChoiceClickListener()),这行代码里,我绑定的是isCheckCache[],所以,多选选项是isCheckCache[]的。

所以,我们就要想办法让多选框的选项显示isCheck[],在打开复选框的之前,先把isCheck的值赋给isCheckCache[]就好了嘛。

isCheckCache = isCheck;


好了,到了这里,我想说的漏洞就来了:

无论是哪个boolean[],只要赋值给了要绑定的boolean[],它的值也会变!



在这个例子里,isCheck就会跟着isCheckCache,在点击选项的时候一起改变---isCheck和isCheckCache一样,那就会失去缓存的意义。

那好吧,我中间再隔一个isCheck2[]试试吧。

isCheck2[] = isCheck[];

isCheckCache = isCheck2[]; 


悲剧的是,不论你中间经过多少个值,就算十个isCheck[]都会一起改变值。


行!我还有一招:我建一个类CheckTest,把isCheck[]放进去,private之,设置set和get:

class CheckTest{

private boolean[] isCheck;

public boolean[] getIsCheck(){

return isCheck;

}

public void setIsCheck(boolean[] isCheck){

this.isCheck = isCheck;

}


}


然后我在确定键的监听方法 MyDiaglogOnClickPositiveListener() 里把值赋过去,总行了吧!


不行!!!!!还是不行!!



这就是JAVA的引用问题。

使用clone()方法就好了。


脑子抽了,竟然没想到。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值