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 的相关文章

  • Android Studio 2.0 AVD 管理器中缺少 API 14 和 15

    在Android Studio中创建AVD时 列表中缺少API 14和15的系统映像 尽管我实际上在SDK管理器中安装了相应的SDK版本 我认为这个问题是在升级到Android Studio 2 0后出现的 如何为这些 API 版本创建 A
  • 在 Retrofit 中的 POST 请求中发送空正文

    我的 api 需要一个空的 json 主体 发出帖子请求时 如何在 Retrofit 和 Jackson 中进行设置 我尝试通过null 和空字符串 以及 但无法让它发挥作用 POST my url Call
  • 如何从Android手机获取所有音乐文件的列表

    我创建了一个扫描手机上音乐文件的应用程序 如果我扫描文件夹 它会扫描音乐文件 SD卡 音乐但当我写入时它不会扫描 mp3 文件 sdcard 它运行良好 但它在某些设备上不起作用 应用程序崩溃可能是因为该手机上不存在该路径 我该怎么办 CO
  • Bean 属性不可读或具有无效的 getter 方法

    因此 我的任务是为注册表路由编写一个简单的 Web 应用程序 使用 Spring MVC 所以我有 路线 类 我想在其中保留起点 终点和中间点列表 但我不明白如何将值从 jsp 放入列表 例如使用 jstl 所以我决定解析一个字符串 pub
  • 无法安装 JDK 9,因为“另一个 Java 安装正在进行中”

    我已经在 Windows 10 x64 上使用 JDK 9 一段时间了 但是当我去安装最新的早期版本 b174 时 我首先卸载了以前的版本 像往常一样 然后运行新的安装程序 它失败并显示一个消息框 显示 另一个 Java 安装正在进行中 您
  • Java DocumentBuilder - XML 文件中的缩进错误

    我尝试使用 DocumentBuilder 用 Ja va 编写一个简单的 XML 文件 我期望 XML 文件如下所示
  • egit:设置gitignore忽略所有eclipse项目文件

    我在 github 上有一个项目 我想从中删除所有与 eclipse 相关的文件 并允许克隆它的人使用他们想要的任何 ide 这是该项目 https github com vedi0boy Archipelo https github co
  • Jlist 自定义渲染器

    我正在尝试添加一个我猜你会称其为列表中每个项目的子列表 我构建了一个自定义渲染器 它提供以下输出 正如你所看到的 有些东西不对劲 我没能找到问题的答案 我猜我需要更改面板布局中的某些内容才能获得正确的结果 但不知道是什么 https i s
  • Java 8 中函数类型全等 lambda 表达式的用法

    我对 的定义和用法感到困惑 Stream collect Supplier
  • 错误:找不到符号 ArrayList

    我正在尝试创建某种列表来存储数组 表 中的值 我在这里使用数组列表 但我应该使用列表吗 但是 每次我尝试编译时 它都会引发以下错误 找不到标志 符号 ArrayList类 位置 玩家类 TablePlayer 代码如下 public cla
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。在 android studio Chipmunk 中添加新的依赖项时

    这些是我的等级文件 项目 Top level build file where you can add configuration options common to all sub projects modules plugins id
  • Android Studio SDK 安装程序在解压缩“platform-tools/systrace/NOTICE”时无限期挂起

    adb 无法从命令提示符处使用 设置了正确的路径 我认为平台工具的原始安装出现了问题 Studio 告诉我更新 但每次都会发生这种情况 我的机器上似乎缺少 adb exe this is the android studio event l
  • 解析XML文件以获取所有命名空间信息

    我希望能够从给定的 XML 文件中获取所有名称空间信息 例如 如果输入 XML 文件类似于
  • 是否有适合 Java 1.4 和 SE (Swing) 应用程序的优秀 DI 框架?

    我正在寻找一个适用于在 JDK 1 4 下运行的 Java SE Swing 应用程序的依赖注入框架 有没有我可以使用的推荐 DI 框架 Guice 和其他基于注释的框架已经退出 我不想搞乱像 Retroweaver 这样的东西 另外 Sp
  • Xuggler 未转换 .webm 文件?

    我只是尝试使用 Xuggler 将 mov 文件转换为 webm 这应该可以工作 因为 FFMPEG 支持 webm 文件 这是我的代码 IMediaReader reader ToolFactory makeReader home use
  • 加载远程图像

    在 Android 中 最简单的方法是什么 从远程服务器加载图像 将其显示在 ImageView 中 这是我在应用程序中实际使用的方法 我知道它有效 try URL thumb u new URL http www example com
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 从java小程序获取正确的本地IP地址

    我想从我的 java 小程序确定本地 IP 地址 问题是当同一台机器上有多个 IP 地址时 该机器具有 LAN 和互联网连接 掌上电脑 VMWare 这是我的测试 public static void main String args tr
  • 无法以联觉方式绘制像素、Pi 数

    我想将 pi 数字的每个数字打印为彩色像素 因此 我得到一个带有 pi 数字的输入 然后将其解析为一个列表 每个节点包含一个数字 我知道 稍后我将使用一个数组 但我从来没有把它画到屏幕上 有人能帮我看看我错在哪里吗 import java
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但

随机推荐

  • 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