效果图

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <com.bu_ish.custom_radio_button.RadioGroup
android:id="@+id/rgTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:checkedButton="@id/urbApproved"> <com.bu_ish.custom_radio_button.UnderlineRadioButton
android:id="@+id/urbAll"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:text="全部"
app:textColorChecked="@color/colorPrimary"
app:textColorUnchecked="#55000000"
app:textMarginBottom="3dp"
app:textMarginTop="3dp"
app:underlineColorChecked="@color/colorPrimary"
app:underlineColorUnchecked="@android:color/transparent"
app:underlineHeight="3dp" /> <com.bu_ish.custom_radio_button.UnderlineRadioButton
android:id="@+id/urbApproved"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:text="已通过"
app:textColorChecked="@color/colorPrimary"
app:textColorUnchecked="#55000000"
app:textMarginBottom="3dp"
app:textMarginTop="3dp"
app:underlineColorChecked="@color/colorPrimary"
app:underlineColorUnchecked="@android:color/transparent"
app:underlineHeight="3dp" /> <com.bu_ish.custom_radio_button.UnderlineRadioButton
android:id="@+id/urbVerifying"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:text="审核中"
app:textColorChecked="@color/colorPrimary"
app:textColorUnchecked="#55000000"
app:textMarginBottom="3dp"
app:textMarginTop="3dp"
app:underlineColorChecked="@color/colorPrimary"
app:underlineColorUnchecked="@android:color/transparent"
app:underlineHeight="3dp" />
</com.bu_ish.custom_radio_button.RadioGroup> <TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center"
android:text="已通过" />
</LinearLayout>

MainActivity.java

package com.bu_ish.custom_radio_button;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView; public class MainActivity extends AppCompatActivity {
private RadioGroup rgTab;
private TextView tvContent; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rgTab = findViewById(R.id.rgTab);
tvContent = findViewById(R.id.tvContent);
rgTab.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(int checkedId) {
switch (checkedId) {
case R.id.urbAll:
tvContent.setText("全部");
break;
case R.id.urbApproved:
tvContent.setText("已通过");
break;
case R.id.urbVerifying:
tvContent.setText("审核中");
}
}
});
}
}

RadioGroup.java

package com.bu_ish.custom_radio_button;

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout; public class RadioGroup extends LinearLayout {
private int checkedId;
private OnCheckedChangeListener onCheckedChangeListener;
private static final String KEY_SUPER_PARCELABLE = "SuperParcelableKey";
private static final String KEY_CHECKED_ID = "CheckedIdKey"; public RadioGroup(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RadioGroup);
checkedId = typedArray.getResourceId(R.styleable.RadioGroup_checkedButton, NO_ID);
typedArray.recycle();
} @Override
protected void onFinishInflate() {
super.onFinishInflate();
if (checkedId != NO_ID) {
setCheckedStateForView(checkedId, true);
}
} @Override
protected Parcelable onSaveInstanceState() {
Parcelable superParcelable = super.onSaveInstanceState();
Bundle bundle = new Bundle();
bundle.putParcelable(KEY_SUPER_PARCELABLE, superParcelable);
bundle.putInt(KEY_CHECKED_ID, checkedId);
return bundle;
} @Override
protected void onRestoreInstanceState(Parcelable state) {
Bundle bundle = (Bundle) state;
super.onRestoreInstanceState(bundle.getParcelable(KEY_SUPER_PARCELABLE));
int id = bundle.getInt(KEY_CHECKED_ID);
check(id);
} @Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
UnderlineRadioButton button = (UnderlineRadioButton) child;
if (button.isChecked()) {
int buttonId = button.getId();
if (buttonId != checkedId) {
setCheckedId(buttonId);
if (checkedId != NO_ID) {
setCheckedStateForView(checkedId, false);
}
}
}
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int id = v.getId();
if (id != checkedId) {
check(id);
}
}
});
super.addView(child, index, params);
} public void check(int id) {
if (id != checkedId) {
setCheckedStateForView(checkedId, false);
setCheckedStateForView(id, true);
setCheckedId(id);
}
} public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
onCheckedChangeListener = listener;
} private void setCheckedStateForView(int viewId, boolean checked) {
UnderlineRadioButton button = findViewById(viewId);
button.setChecked(checked);
} private void setCheckedId(int id) {
checkedId = id;
if (onCheckedChangeListener != null) {
onCheckedChangeListener.onCheckedChanged(id);
}
} public interface OnCheckedChangeListener {
void onCheckedChanged(int checkedId);
}
}

UnderlineRadioButton.java

package com.bu_ish.custom_radio_button;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView; public class UnderlineRadioButton extends FrameLayout {
private TextView tvText;
private View underline;
private int textColorChecked, textColorUnchecked;
private int underlineColorChecked, underlineColorUnchecked;
private boolean checked; public UnderlineRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.UnderlineRadioButton);
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
LayoutParams llLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llLayoutParams.gravity = Gravity.CENTER;
tvText = new TextView(context);
String text = typedArray.getString(R.styleable.UnderlineRadioButton_text);
tvText.setText(text);
LinearLayout.LayoutParams tvTextLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
tvTextLayoutParams.gravity = Gravity.CENTER;
tvTextLayoutParams.topMargin = typedArray.getDimensionPixelSize(R.styleable.UnderlineRadioButton_textMarginTop, 0);
tvTextLayoutParams.bottomMargin = typedArray.getDimensionPixelSize(R.styleable.UnderlineRadioButton_textMarginBottom, 0);
ll.addView(tvText, tvTextLayoutParams);
underline = new View(context);
int underlineHeight = typedArray.getDimensionPixelSize(R.styleable.UnderlineRadioButton_underlineHeight, 0);
LinearLayout.LayoutParams underlineLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, underlineHeight);
ll.addView(underline, underlineLayoutParams);
addView(ll, llLayoutParams);
boolean checked = typedArray.getBoolean(R.styleable.UnderlineRadioButton_checked, false);
textColorChecked = typedArray.getColor(R.styleable.UnderlineRadioButton_textColorChecked, 0);
textColorUnchecked = typedArray.getColor(R.styleable.UnderlineRadioButton_textColorUnchecked, 0);
underlineColorChecked = typedArray.getColor(R.styleable.UnderlineRadioButton_underlineColorChecked, 0);
underlineColorUnchecked = typedArray.getColor(R.styleable.UnderlineRadioButton_underlineColorUnchecked, 0);
setChecked(checked);
typedArray.recycle();
} public boolean isChecked() {
return checked;
} public void setChecked(boolean checked) {
this.checked = checked;
if (checked) {
tvText.setTextColor(textColorChecked);
underline.setBackgroundColor(underlineColorChecked);
} else {
tvText.setTextColor(textColorUnchecked);
underline.setBackgroundColor(underlineColorUnchecked);
}
}
}

P.S.

onSaveInstanceState用于保存实例状态

onRestoreInstanceState用于恢复实例状态

onFinishInflate,完成填充的回调

完整Demo链接:https://pan.baidu.com/s/1E_kQoVaatxFMdstfzw8oZw,提取码:rg9c

Android笔记之自定义的RadioGroup、RadioButton,以及View实例状态的保存与恢复的更多相关文章

  1. Android笔记之自定义对话框

    效果如下图 对话框布局 dialog_uninstallation_confirmation.xml <?xml version="1.0" encoding="u ...

  2. Android笔记之自定义PopupWindow

    效果图 popup_window_addition.xml <?xml version="1.0" encoding="utf-8"?> <L ...

  3. Android之Activity状态的保存和恢复

    系统在某些情况下会调用onSaveInstanceState()和onRestoreInstanceState() 这两个方法来保存和恢复Activity的状态. 一句话:Activity在" ...

  4. Android开发中Activity状态的保存与恢复

    当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...

  5. 保存和恢复 Android Fragment 的状态

    经过几年在 Android 应用开发中应用 Fragment 的努力之后,我必须要说尽管Fragment的概念非常优秀,但是它也同时带来了一堆问题.当我们处理实例的状态保存时就需要特别一件一件地修护好 ...

  6. React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)

    React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton) 一,需求与简单介绍 在开发项目时发现RN没有给提供RadioButton和Rad ...

  7. 【Android自定义控件】支持多层嵌套RadioButton的RadioGroup

    前言 非常喜欢用RadioButton+RadioGroup做Tabs,能自动处理选中等效果,但是自带的RadioGroup不支持嵌套RadioButton(从源码可看出仅仅是判断子控件是不是Radi ...

  8. android单选按钮选择,RadioGroup,radioButton

    android单选按钮选择,RadioGroup,radioButton 14. 四 / android基础 / 没有评论   单选布局绑定 如何识别选择

  9. Android RadioGroup/RadioButton

    RadioGroup      RadioButton的集合,提供多选一的机制      属性:   android:orientation="horizontal/vertical&quo ...

随机推荐

  1. zookeeper安装和使用

    Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统,可提供的服务主要有:配置服务.名字服务.分布式同步.组服务等. 1.下载地址 https://mirrors.cnnic.cn ...

  2. CentOS 7.2通过yum安装zabbix

    环境说明 系统版本    CentOS 7.2 x86_64 软件版本    yum安装zabbix 3.0.18 首先准备一台纯净的CentOS 7.2系统 1.配置zabbix源 [root@za ...

  3. C++ 设置文件最近修改时间

    利用VS开发C++项目,经常发现修改系统时间后,每次编译过程会变得很慢,其原因就是当你把系统时间调到未来的一个时间点,然后有意或者无意编辑过一些代码文件,那么这些文件的时间戳就停留在未来. 当你把系统 ...

  4. Linux网络编程中tcp_server和tcp_client函数的封装

    本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成.   tcp_server   服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅 ...

  5. Oracle 导入导出数据库

    imp userid=yrsuser/yrsuser2587 fromuser=yrsuser touser=yrsuser file=E:\yrs.dmp exp userid=yrsuser/yr ...

  6. 我是怎样理解web页面的

    事实上web页面包括三部分东东 1.页面展示的元素(HTML) 2.页面元素展示的样式(CSS) 3.控制页面元素的交互(JavaScript) 不管页面多么复杂,从这三方面去看,都会得到清晰的认识的 ...

  7. oracle经常使用函数(1)

    1.返回与指定的字符相应的十进制数 select ascii('A') A,ascii('z') a,ascii('12') 一打,ascii(' ') kg from dual; 2.返回与指定十进 ...

  8. static 关键字的使用,静态和非静态类的区别

    直接以一个例子说明: using System; using System.Collections.Generic; using System.Diagnostics; using System.IO ...

  9. 【android】listview改变选中行背景图片

    [android]listview改变选中行背景图片 目标:当item选中时,改变其背景图片.效果图如下: 直接在listview的xml文件中使用listselector: 1 2 3 4 5 6 ...

  10. 使用Firebug进行断点调试详解

    利用Firebug我们可以非常方便地对网页上的任何JavaScript代码进行断点调试. 首先,使用快捷键F12在当前页面打开Firebug,并切换到脚本选项卡. 其次,我们需要为指定的js代码添加断 ...