Android原生实现分段选择

六年前写的一个控件,一直没有时间总结,趁年底不怎么忙,整理一下之前写过的组件。供大家一起参考学习。废话不多说,先上图。

一、效果图

实现思路使用的是radioGroup加radiobutton组合方式。原理就是通过修改RadioButton 的background样式实现,radioGroup嵌套radiobutton已经实现单选互斥,故直接监听其选中监听处理数据就好。

dp_0.5:就是0.5dp的意思,自行替换成自己的值。

dp_15:代表15dp

二、布局代码

采用的是RadioGroup嵌套RadioButton的方式。

  <!-- 日期标题 -->
        <RadioGroup
            android:id="@+id/rg_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="@dimen/dp_24"
            android:layout_marginTop="@dimen/dp_15"
            android:orientation="horizontal"
            android:padding="1dp">

            <RadioButton
                android:id="@+id/rb_date_day"
                android:layout_width="@dimen/dp_34"
                android:layout_height="@dimen/dp_17"
                android:background="@drawable/day_checked"
                android:button="@null"
                android:checked="true"
                android:gravity="center"
                android:text="今日"
                android:textColor="@color/white"
                android:textSize="@dimen/sp_10" />

            <RadioButton
                android:id="@+id/rb_date_week"
                android:layout_width="@dimen/dp_34"
                android:layout_height="@dimen/dp_17"
                android:button="@null"
                android:background="@drawable/week_checked"
                android:text="本周"
                android:gravity="center"
                android:textColor="@color/white"
                android:textSize="@dimen/sp_10" />

            <RadioButton
                android:id="@+id/rb_date_month"
                android:layout_width="@dimen/dp_34"
                android:layout_height="@dimen/dp_17"
                android:gravity="center"
                android:background="@drawable/month_checked"
                android:button="@null"
                android:text="本月"
                android:textColor="@color/white"
                android:textSize="@dimen/sp_10" />
        </RadioGroup>

三、样式代码

a.day_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/day_chart_seleced" android:state_checked="true"></item>
    <item android:drawable="@drawable/day_chart_unseleced"></item>
</selector>

a.1 day_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ff2775de" />
    <stroke
        android:width="@dimen/dp_0.5"
        android:color="#2775DE" />
    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="0dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="0dp" />
</shape>

a.2 day_chart_unseleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#06103A" />
    <stroke
        android:width="@dimen/dp_0.5"
        android:color="#2775DE" />
    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="0dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="0dp" />
</shape>

b.week_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/week_chart_seleced" android:state_checked="true"></item>
    <item android:drawable="@drawable/week_chart_unseleced"></item>
</selector>

b.2 week_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ff2775de" />
    <stroke
        android:width="@dimen/dp_0.5"
        android:color="#2775DE" />
    <corners android:radius="@dimen/dp_0" />
</shape>

b.3 week_chart_unseleced样式

这个样式要特别做下说说明,因为"本周"那个控件位于组件的中部,所以边框样式会出现跟左右两边叠加的现象,从而造成边框过粗的视觉。为了解决这个问题,我采用的是layer-list层级布局,通过颜色覆盖的方式,影藏掉 "本周"那个控件的左右边框,来解决这一问题。下面是实现代码。

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape>
            <solid android:color="#06103A" />
            <stroke
                android:width="@dimen/dp_0.5"
                android:color="#2775DE" />
            <corners android:radius="@dimen/dp_0" />
        </shape>
    </item>
    <item
        android:bottom="@dimen/dp_0.5"
        android:top="@dimen/dp_0.5">
        <shape>
            <stroke
                android:width="@dimen/dp_0.5"
                android:color="#06103A" />
        </shape>
    </item>
</layer-list>

c. month_checked样式

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/month_chart_seleced" android:state_checked="true"></item>
    <item android:drawable="@drawable/month_chart_unseleced"></item>
</selector>

c.1 month_chart_seleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#ff2775de" />
    <stroke
        android:width="@dimen/dp_0.5"
        android:color="#2775DE" />
    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="5dp" />
</shape>

c.2 month_chart_unseleced样式

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#06103A" />
    <stroke
        android:width="@dimen/dp_0.5"
        android:color="#2775DE" />
    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="5dp" />
</shape>

四、java代码

由于使用了databinding双向绑定,故就不演示findviewbyid,如果没有使用databinding,自行去实现就好,只需在onCreate()中调用就好。想了下还是加上findviewbyid方式,就怕遇到啥都不懂的新手抱怨。

方法一 //findviewbyid调用方式:
 
 findviewbyid(R.id.rg_gender).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id) {
                switch (id) {
                    case R.id.rb_date_day:
                        Log.d("RadioGroup", "===天===");
                        break;
                    case R.id.rb_date_week:
                        Log.d("RadioGroup", "===周===");
                        break;
                    case R.id.rb_date_month:
                        Log.d("RadioGroup", "===月===");
                        break;
                }
            }
        });



方法二
//databindig调用方式
//绑定数据
        mDataBinding.rgDate.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id) {
                switch (id) {
                    case R.id.rb_date_day:
                        Log.d("RadioGroup", "===天===");
                        break;
                    case R.id.rb_date_week:
                        Log.d("RadioGroup", "===周===");
                        break;
                    case R.id.rb_date_month:
                        Log.d("RadioGroup", "===月===");
                        break;
                }
            }
        });

给予新手的寄语

对于新手来讲,开发总会遇到各种各样的问题,逐个解决就好,注意沟通协调。

相关推荐
晨曦_子画4 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室26 分钟前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
Mr Lee_2 小时前
android 配置鼠标右键快捷对apk进行反编译
android
顾北川_野2 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&2 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood4 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽4 小时前
Android 项目模型配置管理
android
帅得不敢出门5 小时前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc5 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门16 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡