Android 多选按钮Button

2023-10-30

一、先上效果图

 

二、准备阶段:资源文件(可根据项目需要调整样式、大小和颜色等)

在res文件夹下创建以下资源文件,根据根标签选择Root Element

1.

bg_btn_no_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="100dp"
        android:height="30dp" />
    <solid android:color="#002196F3" />
    <corners android:radius="15dp" />

</shape>

2.

bg_btn_select.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="100dp"
        android:height="30dp" />
    <solid android:color="#2196F3" />
    <corners android:radius="15dp" />

</shape>

3.

bg_button_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_btn_no_select" android:state_selected="false" />
    <item android:drawable="@drawable/bg_btn_select" android:state_selected="true" />
</selector>

4.

bg_select_button.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <size
        android:width="200dp"
        android:height="30dp" />
    <corners android:radius="15dp" />
    <solid android:color="#66757575" />

</shape>

三、布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_margin="10dp"
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:background="@drawable/bg_select_button"
        android:orientation="horizontal">

        <Button
            android:id="@+id/_2_btn1"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_2_btn2"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />
    </LinearLayout>

    <LinearLayout
        android:layout_margin="10dp"
        android:layout_width="300dp"
        android:layout_height="30dp"
        android:background="@drawable/bg_select_button"
        android:orientation="horizontal">

        <Button
            android:id="@+id/_3_btn1"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_3_btn2"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_3_btn3"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />
    </LinearLayout>

    <LinearLayout
        android:layout_margin="10dp"
        android:layout_width="400dp"
        android:layout_height="30dp"
        android:background="@drawable/bg_select_button"
        android:orientation="horizontal">

        <Button
            android:id="@+id/_4_btn1"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_4_btn2"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_4_btn3"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />

        <Button
            android:id="@+id/_4_btn4"
            android:layout_width="100dp"
            android:layout_height="30dp"
            android:background="@drawable/bg_button_selector" />
    </LinearLayout>


</LinearLayout>

四、Java代码

1.MainActivity.java

package com.rivotek.selectbutton;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "LXP_MainActivity";

    //声明按钮控件和对应id,一定要放入数组,方便操作,有几个按钮,Button数组初始化大小就为多少
    private Button[] twoSelectButton = new Button[2];
    private int[] twoSelectButtonIds = new int[]{R.id._2_btn1, R.id._2_btn2};


    private Button[] threeSelectButton = new Button[3];
    private int[] threeSelectButtonIds = new int[]{R.id._3_btn1, R.id._3_btn2, R.id._3_btn3};

    private Button[] fourSelectButton = new Button[4];
    private int[] fourSelectButtonIds = new int[]{R.id._4_btn1, R.id._4_btn2, R.id._4_btn3, R.id._4_btn4};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findView();

        initData();

        setListener();

    }

    private void findView() {
        SelectButtonUtil.findButton(this, twoSelectButton, twoSelectButtonIds);
        SelectButtonUtil.findButton(this, threeSelectButton, threeSelectButtonIds);
        SelectButtonUtil.findButton(this, fourSelectButton, fourSelectButtonIds);
    }

    private void initData() {
        setButtonState(this, twoSelectButton, twoSelectButtonIds, 0);
        setButtonState(this, threeSelectButton, threeSelectButtonIds, 0);
        setButtonState(this, fourSelectButton, fourSelectButtonIds, 0);
    }

    private void setListener() {
        SelectButtonUtil.setListener(this, twoSelectButton, twoSelectButtonIds, this);
        SelectButtonUtil.setListener(this, threeSelectButton, threeSelectButtonIds, this);
        SelectButtonUtil.setListener(this, fourSelectButton, fourSelectButtonIds, this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id._2_btn1:
                setButtonState(this, twoSelectButton, twoSelectButtonIds, 0);
                break;
            case R.id._2_btn2:
                setButtonState(this, twoSelectButton, twoSelectButtonIds, 1);
                break;
            case R.id._3_btn1:
                setButtonState(this, threeSelectButton, threeSelectButtonIds, 0);
                break;
            case R.id._3_btn2:
                setButtonState(this, threeSelectButton, threeSelectButtonIds, 1);
                break;
            case R.id._3_btn3:
                setButtonState(this, threeSelectButton, threeSelectButtonIds, 2);
                break;
            case R.id._4_btn1:
                setButtonState(this, fourSelectButton, fourSelectButtonIds, 0);
                break;
            case R.id._4_btn2:
                setButtonState(this, fourSelectButton, fourSelectButtonIds, 1);
                break;
            case R.id._4_btn3:
                setButtonState(this, fourSelectButton, fourSelectButtonIds, 2);
                break;
            case R.id._4_btn4:
                setButtonState(this, fourSelectButton, fourSelectButtonIds, 3);
                break;
            default:
                break;
        }
    }

    private void setButtonState(Activity activity, Button[] btnArr, int[] idArr, int index) {
        Log.i(TAG, "isSelect = " + SelectButtonUtil.isSelected(btnArr, index));
        if (!SelectButtonUtil.isSelected(btnArr, index)) {
            Log.i(TAG, "into if~");
            SelectButtonUtil.setState(index, activity, btnArr, idArr);
        }
    }
}

2.SelectButtonUtil.java

package com.rivotek.selectbutton;

import android.app.Activity;
import android.view.View;
import android.widget.Button;

/**
 * 多选按钮操作工具类 用于定位控件(findView)、设置按钮选中状态、设置监听(setListener)
 */
public class SelectButtonUtil {
    /**
     * findView
     *
     * @param activity view对应的Activity对象
     * @param btnArr   多选按钮数组
     * @param idArr    多选按钮数组button对应的id数组
     */
    public static void findButton(Activity activity, Button[] btnArr, int[] idArr) {
        for (int i = 0; i < btnArr.length; i++) {
            btnArr[i] = activity.findViewById(idArr[i]);
        }
    }

    /**
     * 设置按钮状态
     *
     * @param index    选中按钮对应的数组角标
     * @param activity view对应的Activity对象
     * @param btnArr   多选按钮数组
     * @param idArr    多选按钮数组button对应的id数组
     */
    public static void setState(int index, Activity activity, Button[] btnArr, int[] idArr) {
        for (int i = 0; i < btnArr.length; i++) {
            if (i == index) {
                btnArr[i].setSelected(true);
            } else {
                btnArr[i].setSelected(false);
            }
        }
    }

    /**
     * 设置按钮监听
     *
     * @param activity view对应的Activity对象
     * @param btnArr   多选按钮数组
     * @param idArr    多选按钮数组button对应的id数组
     * @param listener 监听实现类,一般放到Activity里实现,传入Activity对象
     */
    public static void setListener(Activity activity, Button[] btnArr, int[] idArr, View.OnClickListener listener) {
        for (int i = 0; i < btnArr.length; i++) {
            btnArr[i].setOnClickListener(listener);
        }
    }

    /**
     * 判断多选按钮的一个按钮是否被选中
     *
     * @param btnArr 多选按钮数组
     * @param index  选中按钮对应的数组角标
     * @return true 被选中 / false 未选中
     */
    public static boolean isSelected(Button[] btnArr, int index) {
        return btnArr[index].isSelected();
    }

}无

结语:

如果需要多个按钮,继续再添加到布局文件即可,再到MainActivity初始化就可以使用啦!

一般情况二选一、三选一和四选一按钮够日常使用,如果需要五选一或更多,可以按照布局和代码的方式继续添加。

希望对大家有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 多选按钮Button 的相关文章

随机推荐

  • idea启动项目很久很慢的一种解决方案

    一 问题描述 IntelliJ idea 在启动项目时 很久很慢 二 解决 在不买个更强更贵的前提下 有以下一种解决方案 1 方案依据 一般地 JVM实例默认最大堆内存是机器的1 64 在启动时会不断地fullGC 不断的申请内存 所以我们
  • FreeBSD SSH配置详解

    ssh config和sshd config都是ssh服务器的配置文件 二者区别在于 前者是针对客户端的配置文件 后者则是针对服务端的配置文件 两个配置文件都允许你通过设置不同的选项来改变客 户端程序的运行方式 下面列出来的是两个配置文件中
  • 【STM32学习】——定时器的编码器接口&正交编码器&编码器接口测速代码实操

    文章目录 前言 一 编码器接口 1 简介 2 正交编码器 二 实操案例 编码器接口测速 总结心得 声明 学习笔记根据b站江科大自化协stm32入门教程编辑 仅供学习交流使用 前言 引入 本实操案例与之前学习外部中断时写的旋转编码器计次的代码
  • 用git bash上传文件到gitee

    本地上传 下载git 官网链接 Git 点击Downloads 选择自己的系统类型 我选的是64 bit Git forWindows Setup 安装git 安装过程中只需额外勾选下图选项即可 这样git bash快捷键将会出现在桌面 会
  • 55. 跳跃游戏 45. 跳跃游戏 II

    55 跳跃游戏 给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例 1 输入 nums 2 3 1 1 4 输出 true 解释 可以先跳 1
  • 数据挖掘之C4.5决策树算法

    1 决策树算法实现的三个过程 特征选择 选择哪些特征作为分类的标准是决策树算法的关键 因此需要一种衡量标准来进行特征的确定 不同的决策树衡量标准不同 例如C4 5决策树就是以信息增益率来作为衡量标准 决策树的生成 根据所选择的衡量标准不断递
  • Ubuntu 20系统WIFI断连问题

    最近工作需要购置了一台GPU机器 然后搭建了深度学习的运行环境 在工作中将这台机器当做深度学习的服务器来使用 前期已经配置好多用户以及基础环境 但最近通过xshell连接总是不间断的出现断连现象 下面记录下 为此主要进行的操作 1 IP地址
  • Dubbo的几种序列化协议

    dubbo 支持哪些通信协议 支持哪些序列化协议 说一下 Hessian 的数据结构 PB 知道吗 为什么 PB 的效率是最高面试官心理分析 面试官心理分析 上一个问题 说说 dubbo 的基本工作原理 那是你必须知道的 至少要知道 dub
  • 802.11 - 定向多播服务(Directed multicast service)

    定向多播服务 前言 802 11v指定了定向多播服务 directed multicast service DMS 使客户端设备能够请求AP直接向其发送组播和广播帧 提高了网络效率 DMS的传输速率比定期组播每秒快数百Mb 与非DMS基础设
  • Basic Level 1035 插入与归并 (25分)

    题目 根据维基百科的定义 插入排序是迭代算法 逐一获得输入数据 逐步产生有序的输出序列 每步迭代中 算法从输入序列中取出一元素 将之插入有序序列中正确的位置 如此迭代直到全部元素有序 归并排序进行如下迭代操作 首先将原始序列看成 N 个只包
  • Java的流程控制结构以及程序跳转关键字详解

    本文详细介绍了Java中的流程控制结构 以及跳转关键字break continue return的使用 文章目录 1 流程控制结构分类 2 顺序结构 3 选择结构 3 1 if语句 3 1 1 if 3 1 2 if else 3 1 3
  • 匿名科创无人机学习心得

    1 飞控stm32串口5连接imu 串口五发送的指令会发送到imu中 如果是自定义的用户格式帧 比如 AA FF F1 03 01 01 01 A0 67 会先到imu imu的串口1接stm飞控 串口2接数传 从串口1接收到的数据会通过串
  • element-ui表单仅对el-form表单的部分字段/某个字段进行验证

    根据elementui文档 查询到validateField方法 可以给表单的某个字段添加校验 对表单单个字段进行校验 data rules email required true message 请输入邮箱 trigger change
  • 2023年最新版IDEA安装(超详细)

    个人主页 平行线也会相交 欢迎 点赞 收藏 留言 加关注 本文由 平行线也会相交 原创 收录于专栏 JavaSE primary 写在前面 IDEA的安装是建立在JDK安装好了的前提下 否则IDEA是无法使用的 具体JDK如何安装可以参照此
  • C ++ Primer(第五版)第十三章练习答案

    C Primer 第五版 第十三章练习答案 13 1 1 节练习 练习 13 1 练习 13 2 练习 13 3 练习 13 4 练习 13 5 13 1 2 节练习 练习 13 6 练习 13 7 练习 13 8 13 1 3 节练习 练
  • Dubbo与SpringCloud框架详解

    一 互联网架构演进 1 互联网项目架构 1 互联网项目与传统项目 互联网项目架构的特点 用户多 流量大 并发高 海量数据 易受攻击 功能繁琐 变更快 传统项目和互联网项目的不同 用户体验 美观 功能 速度 稳定性 大型互联网项目架构的目标
  • Qt/C++实现函数指针的使用

    1 背景 对于if else语句或者switch case语句非常累赘 且每个分支结构基本一致情况下 可以使用列表方式代替if else或者switch case 对于C语言这方面很容易实现 但是对于C 的类成员来说需要特殊的要求 2 代码
  • AVX Intrinsics各函数介绍

    SIMD相关头文件包括 include
  • 《Linux运维实战:Centos7.6一键离线部署mysql5.7.29集群》

    文章目录 一 部署背景 三 部署工具 三 部署演示 总结 整理不易 如果对你有帮助 可否点赞关注一下 一 部署背景 由于业务系统的特殊性 我们需要面向不通的客户安装我们的业务系统 而作为基础组件中的mysql针对不同的客户环境需要多次部署
  • Android 多选按钮Button

    一 先上效果图 二 准备阶段 资源文件 可根据项目需要调整样式 大小和颜色等 在res文件夹下创建以下资源文件 根据根标签选择Root Element 1 bg btn no select xml