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

[基础控件]—状态切换控件CompoundButton及其子类CheckBox、RadioButton、ToggleButton、switch事件监听与场景使用一、事件监听对于普通的Button,对其进行事件监听Google官方给出了常见的三种监听方式:1、对每一个button设置事件监听器button.setOnClickListener(View.Onc

大家好,又见面了,我是你们的朋友全栈君。

一、事件监听

对于普通的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扩展

—未完待续

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154810.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一阶倒立摆的PID_简单旋转装置

    一阶倒立摆的PID_简单旋转装置  我做PID算法的背景和经历:本人之前电子信息科学与技术专业,对控制方向颇感兴趣,刚上大学时听到实验室老师说PID算法,那年在暑假集训准备全国电子设计竞赛,我正在练习做一个以前专科的题目,帆板角度控制系统,还不懂PID是个什么玩意,老师让我把PID加到这个题目里。当时给了一些电子版的一些教程,但是没看懂。。。。。。。后来对四旋翼很感兴趣,想弄一架玩玩再亲自写程序做一架,买了PIX飞控玩了很久,自…

    2022年8月18日
  • LaTeX简明教程(一)[通俗易懂]

    LaTeX简明教程(一)[通俗易懂]LaTeX的安装配置与第一个latex文件的编译(hellolatex!)

    2022年7月1日
  • 解决 Mac和Idea 终端关闭后,环境变量失效,每次都需source ~/.bash_profile 问题

    解决 Mac和Idea 终端关闭后,环境变量失效,每次都需source ~/.bash_profile 问题

    2022年2月20日
  • 知识图谱—知识推理综述(三)

    知识图谱—知识推理综述(三)知识图谱—知识推理综述(三)接上一篇文章知识图谱—知识推理综述(二)3基于表示的知识推理3.1方法简述在之前所介绍的知识推理中,都显示的定义了知识推理所需要的规则,条件等等离散符号。而在基于表示的知识推理中,我们第一步是将知识图谱中的节点和关系进行连续向量空间的映射,需要将其物理表示映射为数值表示,然后在利用数学中的相关算法,通过数值计算的方式进行知识推理。对于映射的向量空间而言,其可以是一个或者多个的向量或者矩阵。基于表示的推理的核心在于“如何表示”,在表示学习的过程中,我们需要的是让算法自

    2022年5月12日
  • 拓扑图怎么看_拓扑排序算法图解

    拓扑图怎么看_拓扑排序算法图解一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站。每个火车站都有一个级别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是 5 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 5 趟车次由于停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求。现有 m

    2022年8月10日
  • oracle杀进程命令_oracle如何查看进程

    oracle杀进程命令_oracle如何查看进程1、查看锁表进程–1.查看锁表进程SQL语句selectsess.sid,sess.serial#,lo.oracle_username,lo.os_user_name,ao.object_name,lo.locked_modefromv$locked_objectlo,dba_objectsao…

    2022年9月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号