手把手教你写软件5.radiobutton和checkbox

在软件中,radiobutton和checkbox是比较常用的,前者表示单选,后者表示多选。但是在实际项目中,并不会仅仅只是单选多选这么简单,在这里,我分享一下我在写软件过程中所涉及到的拓展。
首先说一下我的需求,在一个radioGroup中有多个radiobutton,每选择一个会获得不同的分数。 注意:是选择而不是点击
在一个页面中,用户可能只会选择其中的一部分(类似于做选择题,并没有把题做完,只做了其中一部分)。而且用户可能选择其中一个按钮后发现不对,然后更改选择,点击其他按钮,最后当下次返回该界面的时候,已经选择的题不应该还能再选,没选择的题应该可以再选。

我们来认真分析每一个需求:
1.每个按钮对应 不同的值,所以单纯的点击监听事件是会出错的,比如三个按钮,对应的值分别为1,2,3.点击第一个后发现不对,又点击第二个,分数就变为1+2=3.这是不对的。怎么解决呢?我的方法是根据点击次数重写监听事件。具体点说就是每个按钮如果点击次数为奇数表示用户选择了按钮,就加对应的分数,并且把其他按钮设置为不可点击。如果为偶数,表示用户双击了按钮,就减去对应的分数,并把其他按钮设置为可以点击。那么,用户点击后就会有分数,如果用户发现不对,双击按钮后分数还原,可以继而去选择其他的按钮。那么这个问题就完美解决了。

代码如下:

radioButton2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { boolean po=true; if(po){ score++;po=false; radioButton3.setEnable(false);} else{ score--;po=true; radioButton3.setEnable(true); radioGroup.clearCheck();//清除所有选项
}
}

2.用户只选择了其中一部分,那么我们应该用对应数量的Boolean变量来记录,一旦用户点击按钮,就要保存这个操作,为了方便理解,在这里我们插入一点新东西,就是前面提到的本地存储。
本地储存分三种,今天我们这里只介绍最简单的SharePreferences。
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();//表示在本地生成一个名为“data"的文本。MODE_PRIVATE表示如果重命名,可替代原来的文本。
SharedPreferences SP=getSharedPreferences("data",MODE_PRIVATE);//调用操作

好了,关于用法马上会用到,现在我们回来继续我们的分析。认真分析会发现,如果我们在radioGroup中选择了某个选项,会有一个共同点,那是什么?对,没错,po=false;这个就是这个难题的突破点。所以我们应该把这个po保存在我们本地,它的变化可以给我们反馈该按钮是否被点击的信息。那么,一旦po=false,下次运行的时候,整个radioGroup都应该是不可点击的状态,是不是这个难题就被我们轻易解决了?代码如下:

更改代码如下:

boolean p0=SP.getBoolean("p0",true);//如果p0没有初始值,就默认为true
            radioButton2.setEnabled(p0);
            radioButton3.setEnabled(p0);


radioButton2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {       //单击确定,另外的按钮设为不可见,双击取消,所有选项还原
                boolean p0=SP.getBoolean("p0",true);
                if(p0)
                {score+=5;
                SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                editor.putBoolean("p0",false);//将p0的值修改为false,并保存在data文本
                radioButton3.setEnabled(false);
                editor.apply();   } //提交信息,这步必须有
                else{
                    score-=5;
                    SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                    editor.putBoolean("p0",true);radioButton3.setEnabled(true);
                    editor.apply();radioGroup.clearCheck();
                }

            }
        });

关于radioButton就讲完了,下面我们来看看checkBox吧。
checkBox是多选框,相比于radioButton复杂要复杂一点,同样的单击选择,双击取消数据还原应该是日常操作,代码如下:
checkBox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b) {score+=2;
                    SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                    editor.putBoolean("p11",false);editor.apply();}
                else {score-=2;
                    SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                    editor.putBoolean("p11",true);editor.apply();}
            }
        });

没什么好解释的,简单提一下,b表示是否被点击,如果被点击p11就设为false,如果双击就设为true;
那么,在现实中,我们会遇到这种情况:如图:

当我们点击了没有的时候,点击其他的选项是无效的,还有就是如果我们先点击了其他选项,后点击没有,应该减去其他选项所对应的分数。

要解决问题就要一步一步分析,首先,我们可以沿用前面的基本思路,双击取消,所以,当点击了没有,其他按钮设为不可点击,并且判断那些按钮被点击了,如果被点击,应该数据还原。这样问题是不是又完美解决了?代码如下:

checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(CompoundButton compoundButton, boolean b) {     //双击复选框按钮复原
               if(b) {if(checkBox2.isChecked()) score-=2;
                   checkBox2.setEnabled(false);
                   if(checkBox3.isChecked()) score-=2;
                   checkBox3.setEnabled(false);
                   if(checkBox4.isChecked()) score-=2;
                   checkBox4.setEnabled(false);score+=0;SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                   editor.putBoolean("p11",false);editor.apply();}
               else {if(checkBox2.isChecked()) score+=2;
                   checkBox2.setEnabled(true);
                   if(checkBox3.isChecked()) score+=2;
                   checkBox3.setEnabled(true);
                   if(checkBox4.isChecked()) score+=2;
                   checkBox4.setEnabled(true);score-=0;SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                   editor.putBoolean("p11",true);editor.apply();}
           }
       });

最后,添加检查事件,如果这次该题被选了,下次进入界面应该不能再选,很简单就可以实现:

boolean p11=SP.getBoolean("p11",true);
            checkBox.setEnabled(p11);checkBox2.setEnabled(p11);checkBox3.setEnabled(p11);checkBox4.setEnabled(p11);
好了,关于radioButton和CheckBox的讲解就到这里了,当然如果有更复杂的需求,这里肯定满足不了,所以共同进步吧

猜你喜欢

转载自blog.csdn.net/qq_37820491/article/details/80159506