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;
                }
            }
        });

给予新手的寄语

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

相关推荐
難釋懷1 小时前
Android开发-在应用之间共享数据
android·jvm·oracle
難釋懷3 小时前
Android开发-数据库SQLite
android·数据库·sqlite
androidwork3 小时前
Arrow库:函数式编程在Kotlin Android中的深度实践
android·java·kotlin
androidwork4 小时前
用 Kotlin 脚本(KTS)重塑 Android 工程效能:2000 字终极实践指南
android·开发语言·kotlin
dancing9996 小时前
Android Studio中Gradle 7.0上下项目配置及镜像修改
android·ide·android studio
EQ-雪梨蛋花汤7 小时前
【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
android·性能优化·vr
每次的天空7 小时前
Android学习总结之kotlin篇(二)
android·学习·kotlin
刘洋浪子7 小时前
Android Studio中Gradle中Task列表显示不全解决方案
android·ide·android studio
橙子199110168 小时前
Kotlin 中 infix 关键字的原理和使用场景
android·开发语言·kotlin
后端码匠14 小时前
MySQL 8.0安装(压缩包方式)
android·mysql·adb