zoukankan      html  css  js  c++  java
  • [基础控件]---状态切换控件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扩展

    ---未完待续

  • 相关阅读:
    C# 语音识别
    Android—监听器
    android-Activity
    Android小案例——简单图片浏览器
    针对Android 模拟器启动慢的问题
    emulator-arm.exe 已停止工作、 emulator-x86 已停止工作
    android模拟器启动没有拨号功能
    安装好android的adt以后重启eclipse,但是没有创建AVD的图标
    android环境搭建——工欲善其事,必先利其器 2
    SQL 中常见的系统存储过程
  • 原文地址:https://www.cnblogs.com/android001/p/4311558.html
Copyright © 2011-2022 走看看