一、先上效果图
二、准备阶段:资源文件(可根据项目需要调整样式、大小和颜色等)
在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初始化就可以使用啦!
一般情况二选一、三选一和四选一按钮够日常使用,如果需要五选一或更多,可以按照布局和代码的方式继续添加。
希望对大家有帮助。