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

给予新手的寄语

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

相关推荐
龚礼鹏3 分钟前
AndroidStudio module编译aar混淆文件处理
android
程序员阿鹏2 小时前
MySQL中给字段添加唯一约束的方式有哪些?
android·数据库·mysql
三少爷的鞋4 小时前
Android Data 层设计的四条红线:为什么必须坚持、如何落地
android
猫豆~4 小时前
zabbix实战——3day
android
知行合一。。。5 小时前
Python--01--核心基础
android·java·python
汤米粥5 小时前
Android简单易用的视频压缩
android
怀君6 小时前
Uniapp——Android离线打包自定义基座教程
android·uni-app
ellis19706 小时前
Unity出安卓包知识点汇总
android·unity
urkay-6 小时前
Android 全局悬浮窗
android·gitee
朝花不迟暮7 小时前
Go基础-闭包
android·开发语言·golang