初学安卓路之CheckBox与RadioGroup

来源:互联网 发布:hadoop数据目录配置 编辑:程序博客网 时间:2024/04/30 11:34

We’re here to put a dent in the universe. Otherwise why else even be here?
活着就是为了改变世界,难道还有其他原因吗?——乔布斯

  小弟初学安卓,该文算是小弟的学习过程,课后笔记与一些自己的思考,希望在自己的自学路上留下印记,也许有一些自己想的不对的地方,希望各位前辈斧正。

  1.先识CheckBox
    CheckBox,就是这玩意!123应该是大家经常见到的吧。
    那些大众的属性就不说了,它比较关键的属性是
    android:checked=”false”
    //false为未被勾选状态,true为被勾选状态。
    
    其实这里我就开始逗了,因为当时我没多想没去想到CheckBox是复选框的意思,当时我就想去做一个效果就是三个CheckBox,只能单选,选中一个其它的取消勾选(后来才发现那是RadioGroup和RadioButton的工作),于是:
    
    这里写图片描述
    
监听器代码是(写的比较菜):

    private CompoundButton.OnCheckedChangeListener myCheck = new CompoundButton.OnCheckedChangeListener() {        @Override        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {            if (buttonView == checkBox1) {                textView.setText("这尼玛穷啊!");                checkBox2.setChecked(false);                checkBox3.setChecked(false);            }            if (buttonView == checkBox2) {                textView.setText("有点小钱咯!");                checkBox1.setChecked(false);                checkBox3.setChecked(false);            }            if (buttonView == checkBox3) {                textView.setText("土豪做个朋友吧!");                checkBox1.setChecked(false);                checkBox2.setChecked(false);            }        }    };

    可以看到很蛋疼的就是,当我点下一个CheckBox时虽然上一个取消了,但是要点第二次才能把它勾选,于是当时想了半天哪错了,最后才发现OnCheckedChangeListener是Checked状态监听器,一旦CheckBox改变状态(无论false还是true)它都会触发,所以我上面那段代码,当我点击第二个CheckBox时其实已经被勾选了,它触发了监听器,改变第一个CheckBox的状态为false,但是,你懂的,因为第一个CheckBox状态改变,它也触发了监听器……尴尬。于是我琢磨了半天,最后换成监听点击事件OnClickListener实现了效果,然后,小弟陷入了沉思(此时依然没发现CheckBox是复选框),有OnClickListener干嘛还要OnCheckedChangeListener呢?
    
    
  2.思考OnClickListener和OnCheckedChangeListener
    一个是点击监听器,一个是Checked状态转换监听器,小弟自行度娘并实践之后终于了解了他们的区别,OnClickListener只有在点击了之后才会触发,而OnCheckedChangeListener是在Checked状态变化时触发,也许一开始想没什么两样,点击不就使状态转变了吗?但是实际上,CheckBox状态转变也可以通过点击以外(或点击其它按钮)的方式达成,而这时,OnClickListener是监听不到的(因为该CheckBox没有产生点击嘛)。
    
    可以看到CheckBox因为点击Button改变了状态但是不显示文字了,因为状态改变而CheckBOX并没被点击,CheckBox点击事件未发生。
    
    附上OnClickListener代码(添加了一个按钮测试):
    

    private View.OnClickListener myClick=new View.OnClickListener() {        @Override        public void onClick(View v) {            if (v == checkBox1) {                textView.setText("这尼玛穷啊!");                checkBox2.setChecked(false);                checkBox3.setChecked(false);            }            if (v == checkBox2) {                textView.setText("有点小钱咯!");                checkBox1.setChecked(false);                checkBox3.setChecked(false);            }            if (v == checkBox3) {                textView.setText("土豪做个朋友吧!");                checkBox1.setChecked(false);                checkBox2.setChecked(false);            }            if(v==btn){                if(!checkBox1.isChecked()){                    checkBox1.setChecked(true);                }else{                    checkBox1.setChecked(false);                }            }        }    };

  3.RadioGroup和RadioButton
    自学到这里的时候,我心中大喊了一声“卧槽”,“RadioGroup是RadioButton的一个集合,提供多选一机制”,看到这里我赶紧查CheckBox的意思,原来是复选框!!我之前想达成的多选一效果应该用RadioGroup来实现,顿感自己学习的还是太囫囵吞枣,得改得改。
    先说RadioButton,就是这个!应该也是常见的吧。这里写图片描述
    RadioButton似乎不推荐单独使用,因为这货在点击一次之后,它的Checked属性变为true后再点击就无法改变了。(后来测试发现通过添加点击事件中用方法setChecked()可以改变状态,但是没必要,因为它本事有它自己的工作,它在RadioGroup完成与其它的RadioButton互斥形成单选)
    
    RadioGroup可以说是一个容纳RadioButton的容器,如果你单独使用RadioButton,多个RadioButton是不会互相影响的,但是在RadioGroup内,只有一个RadioButton能被选择。在设置监听器时,只需要给RadioGroup设置监听器既可,因为RadioGroup有自己的监监听器接口,虽然都是OnCheckedChangeListener,但是它是RadioGroup.OnCheckedChangeListener,是自己特有的。
   
    可以看看RadioGroup.java中的接口定义:
   

    public interface OnCheckedChangeListener {        /**         * <p>Called when the checked radio button has changed. When the         * selection is cleared, checkedId is -1.</p>         *         * @param group the group in which the checked radio button has changed         * @param checkedId the unique identifier of the newly checked radio button         */        public void onCheckedChanged(RadioGroup group, int checkedId);    }

   checkedId这个参数,就是指的RadioGroup内RadioButton的ID。
   
   忘了说RadioGroup在XML中有
   android:orientation=”horizontal”
   //horizontal为RadioButton水平排列,vertical为垂直排列
   垂直排列上面已经有图了,这是水平排列(估计大家也想到了是什么样子):

   最后,附上最后实现多选一框的监听器代码和图片(我试了试把CheckBox放进RadioGroup,并没有啥子用啊):
   

     /**         * 使用匿名内部类实现RadioGroup的监听事件         */        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {            @Override            public void onCheckedChanged(RadioGroup group, int checkedId) {                //chcekedId就是指RadioGroup内RadioButton的ID                switch (checkedId) {                    case R.id.radioButton1:                        Log.i(TAG, "月薪10K你上天!");                        break;                    case R.id.radioButton2:                        Log.i(TAG, "月薪5K凑合过...");                        break;                    case R.id.checkBox1:                        Log.i(TAG, "给大学生一条活路吧!");                        break;                    case R.id.checkBox2:                        Log.i(TAG, "羡慕!一时语塞!");                        break;                }            }        });

这里写图片描述

  
  学习总结:
    第一次写博客,发现还挺费时间的,以上就是我的学习这几个控件的学习经历了,记录下来,以后也要坚持写写,肯定有大把写的不好的地方,但是我会努力的。这些天学下来发现了编程是有许多举一反三的地方的比如设置这些监听器啊,最大的收获就是认识到正确的学习态度啦,不多说,科学上网很重要!!顺带一提MARKDOWN不太会用啊。

                  
                             2016年7月15日  星期五
                                天气热,要死啦~

1 0