Android原生实现分段选择
2023-12-27 12:39:26
? ? ? ? 六年前写的一个控件,一直没有时间总结,趁年底不怎么忙,整理一下之前写过的组件。供大家一起参考学习。废话不多说,先上图。
一、效果图
实现思路使用的是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;
}
}
});
给予新手的寄语
? ? ?对于新手来讲,开发总会遇到各种各样的问题,逐个解决就好,注意沟通协调。
文章来源:https://blog.csdn.net/shi450561200/article/details/135241204
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!