• [基础控件]---状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用


    一、事件监听

    对于普通的Button,对其进行事件监听Google官方给出了常见的三种监听方式:1、对每一个button设置事件监听器button.setOnClickListener(View.OnclickListener  listener);此种方法当button按钮较多时代码显得多、乱、不够简洁明了。

    2、在Activity中实现接口View.OnclickListener,然后重写void onClick(View v)方法,在方法中通过switch(v.getId())予以区分不同Button。此种方法较为简洁,但是需要实现View.OnclickListener接口。3、在xml布局中在想要被监听的

    button上添加属性:android:onClick=”doClick”属性。在Activity 中添加监听方法public void doClick(View view){},此种方法书写简单、明了、不需要实现额外的接口。推荐使用此种方法。也是Google官方文档中常见用法。

    对于状态切换控件CompoundButton,不仅要对事件触发的监听,还有对状态切换的监听。所以在CompoundButton中需要对其进行两个监听:事件触发、状态切换。监听的方式与普通Button三种监听方式相似。只不过是多了一个监听状态的一项

    而已。说多了都是废话,还是直接上码。

    场景一:对UI界面上多个CompoundButton的事件监听做统一处理。

    <ToggleButton
            android:id="@+id/togglebutton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="doClick"
            android:textOff="关"
            android:textOn="开" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <CheckBox
                android:id="@+id/checkbox_meat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="肉" />
    
            <CheckBox
                android:id="@+id/checkbox_cheese"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="奶" />
        </LinearLayout>
    
        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <RadioButton
                android:id="@+id/radiobutton_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="增" />
    
            <RadioButton
                android:id="@+id/radiobutton_delete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="刪" />
    
            <RadioButton
                android:id="@+id/radiobutton_update"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="改" />
    
            <RadioButton
                android:id="@+id/radiobutton_seach"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="doClick"
                android:text="查" />
        </RadioGroup>

    有了布局,下面上Java代码对其所有的CompoundButton控件进行统一监听

    /**
         * 向上转型的目的是为了获取子控件当前状态。
         * @param view
         */
        public void doClick(View view) {
            //1、被选中:toogle中isChecked==on
            boolean isChecked=((CompoundButton)view).isChecked();//向上转型:获取当前状态
            //2、被点击
            switch (view.getId()) {
            case R.id.togglebutton:
                if(isChecked){
                    Log.i("MyInfo", "开");
                }else{
                    Log.i("MyInfo", "关");
                }
                break;
            case R.id.checkbox_meat:
                if(isChecked){
                    Log.i("MyInfo", "肉被选中");
                }else{
                    Log.i("MyInfo", "肉被取消");
                }
                break;
            case R.id.checkbox_cheese:
                
                break;
            case R.id.radiobutton_add://切记:RadioButton无状态的切换,仅有按钮的切换。所以仅需判断选中状态 if(isChecked)
                if(isChecked)
                break;
            case R.id.radiobutton_delete:
                if(isChecked)
                
                break;
            case R.id.radiobutton_update:
                if(isChecked)
                break;
            case R.id.radiobutton_seach:
                if(isChecked)
                break;
            default:
                break;
            }
        }

    在doClick()方法中总体上执行了两个步骤:1被选中---->2被点击。通常这两个步骤先后顺序应该为被点击----->被选中。但是这样需要对每一个子控件分支中都需要添加是否被选中的判断,代码显得重复。

    所以在此我们使用逆向被点击----->被选中。在被选中这一步中使用一个向上转型是为了可以获取所有CompoundButton子类的状态。如果直接强转为某一具体子类,则不具备通用性,不适应判断所有CompoundButton

    子类的被选中状态。

    当UI界面中状态切换控件CompoundBuuton与普通Button均存在的情况下,建议对两种控件的使用不同的方法进行监听,例如:android:onClick=”compoundButtonClick”与android:onClick=”buttonClick”

    二、CompoundButton扩展

    ---未完待续

  • 相关阅读:
    数据结构8.4_动态存储管理之伙伴系统
    http code码实验
    php问题
    对称加密和非对称加密
    公钥与私钥,HTTPS详解
    数字证书原理,公钥私钥加密原理
    简明 Nginx Location Url 配置笔记
    HTTP状态码精简版
    给你掰扯清楚什么是正向代理,什么是反向代理
    关键字
  • 原文地址:https://www.cnblogs.com/android001/p/4311558.html
Copyright © 2020-2023  润新知