
The easiest way I found for this:
1) Extend the RadioButton class as follows:
import android.content.Context; import android.view.ViewGroup; import android.widget.RadioButton; public class RoundedButton extends RadioButton { private static final int[] STATE_ONLY_ONE = new int[] { android.R.attr.state_first, android.R.attr.state_last, }; private static final int[] STATE_FIRST = new int[] { android.R.attr.state_first }; private static final int[] STATE_LAST = new int[] { android.R.attr.state_last }; public RoundedButton(Context context) { super(context); } @Override protected int[] onCreateDrawableState(int extraSpace) { ViewGroup parent = (ViewGroup) getParent(); if (parent == null) { return super.onCreateDrawableState(extraSpace); } final int size = parent.getChildCount(); final boolean isFirst = (parent.getChildAt(0) == this); final boolean isLast = (parent.getChildAt(size-1) == this); int[] states = super.onCreateDrawableState(extraSpace + 2); if (isFirst && isLast) { mergeDrawableStates(states, STATE_ONLY_ONE); } else if (isFirst) { mergeDrawableStates(states, STATE_FIRST); } else if (isLast) { mergeDrawableStates(states, STATE_LAST); } return states; } }
2) Create one XML file in "res / drawable / rbtn_selector.xml", add below XML code for Radio Button background.
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_first="true" android:state_checked="true"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_selected_start" android:endColor="@color/radio_button_selected_end" android:type="linear" /> <corners android:topLeftRadius="10dp" android:topRightRadius="10dp"/> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_selected" /> </shape> </item> <item android:state_first="true" android:state_checked="false"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_unselected_start" android:endColor="@color/radio_button_unselected_end" android:type="linear" /> <corners android:topLeftRadius="10dp" android:topRightRadius="@dimen/radio_button_radius"/> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_unselected" /> </shape> </item> <item android:state_last="true" android:state_checked="true"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_selected_start" android:endColor="@color/radio_button_selected_end" android:type="linear" /> <corners android:bottomLeftRadius="@dimen/radio_button_radius" android:bottomRightRadius="@dimen/radio_button_radius"/> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_selected" /> </shape> </item> <item android:state_last="true" android:state_checked="false"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_unselected_start" android:endColor="@color/radio_button_unselected_end" android:type="linear" /> <corners android:bottomLeftRadius="@dimen/radio_button_radius" android:bottomRightRadius="@dimen/radio_button_radius"/> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_unselected" /> </shape> </item> <item android:state_checked="true"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_selected_start" android:endColor="@color/radio_button_selected_end" android:type="linear" /> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_selected" /> </shape> </item> <item android:state_checked="false"> <shape> <gradient android:angle="90" android:startColor="@color/radio_button_unselected_start" android:endColor="@color/radio_button_unselected_end" android:type="linear" /> <stroke android:width="@dimen/radio_button_border" android:color="@color/radio_button_border_unselected" /> </shape> </item> </selector>
3) Create one XML file in "res / drawable / rbtn_textcolor_selector.xml", add below XML code for radio text buttons. The color of the text selector. (Text Color Selector xml file)
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:color="@color/radio_text_selected"/> <item android:color="@color/radio_text_unselected"/> </selector>
4) Set the style for the button:
4.1). Programmatically add a RoundedButton to the RadioGroup exixsting group:
RoundedButton newRadioButton = new RoundedButton(this.getActivity()); if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { newRadioButton.setBackgroundDrawable(this.getActivity().getResources().getDrawable(R.drawable.rbtn_selector)); } else { newRadioButton.setBackground(this.getActivity().getResources().getDrawable(R.drawable.rbtn_selector)); } newRadioButton.setTextColor(this.getActivity().getResources().getColorStateList(R.color.rbtn_textcolor_selector));
4.2) Xml:
<RoundedButton android:id="@+id/bt_id_1" android:background="@drawable/rbtn_selector" android:textColor="@drawable/rbtn_textcolor_selector" />
5) Select your own colors and sizes, which I used in the example:
<color name="radio_text_selected">#FFF</color> <color name="radio_text_unselected">#222</color> <color name="radio_button_selected_start">#5393c5</color> <color name="radio_button_selected_end">#6facd5</color> <color name="radio_button_unselected_start">#f9f9f9</color> <color name="radio_button_unselected_end">#eee</color> <color name="radio_button_border_selected">#2373a5</color> <color name="radio_button_border_unselected">#aaa</color>
and
<dimen name="radio_button_radius">10dp</dimen> <dimen name="radio_button_border">0.7dp</dimen>