在android中添加自定义单选按钮

时间:2013-10-03 15:50:52

标签: android xml

我正在尝试为android

中的常规按钮获取radiobutton效果

我在

下面有一个简单的安卓单选按钮

enter image description here

此代码为 ::

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <RadioGroup
        android:id="@+id/radioGroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >

        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="true"
            android:text="RadioButton1" />

        <RadioButton
            android:id="@+id/radio1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton2" />

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="RadioButton3" />
    </RadioGroup>


</RelativeLayout>

如何自定义如下::

enter image description here

谢谢

[编辑]使用其中一个答案的代码

enter image description here

但是按钮名称被选择选项如何删除它所掩盖?


{EDIT}更多更改

Finall更改至少应该知道我从三个单选按钮中选择了哪个按钮....是否可以获得如下所示?

enter image description here

11 个答案:

答案 0 :(得分:208)

添加引用图像或选择器(如下所示)的背景drawable,并使按钮透明:

<RadioButton
    android:id="@+id/radio0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/yourbuttonbackground"
    android:button="@android:color/transparent"
    android:checked="true"
    android:text="RadioButton1" />

如果您希望单选按钮在选中时拥有不同的资源,请创建一个可绘制的选择器背景:

RES /抽拉/ yourbuttonbackground.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:drawable="@drawable/b"
        android:state_checked="true"
        android:state_pressed="true" />
    <item
        android:drawable="@drawable/a"
        android:state_pressed="true" />
    <item
        android:drawable="@drawable/a"
        android:state_checked="true" />
    <item
        android:drawable="@drawable/b" />
</selector>

在上面的选择器中,我们引用了两个drawable,ab,以下是我们创建它们的方式:

res / drawable / a.xml - 选定状态

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:radius="5dp" />
    <solid
        android:color="#fff" />
    <stroke
        android:width="2dp"
        android:color="#53aade" />
</shape>

res / drawable / b.xml - 常规状态

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <corners
        android:radius="5dp" />
    <solid
        android:color="#fff" />
    <stroke
        android:width="2dp"
        android:color="#555555" />
</shape>

有关drawables的更多信息:http://developer.android.com/guide/topics/resources/drawable-resource.html

答案 1 :(得分:38)

使用与Evan的答案相同的XML文件格式,但您只需要一个可绘制文件进行格式化。

<RadioButton
    android:id="@+id/radio0"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_button_background"
    android:button="@android:color/transparent"
    android:checked="true"
    android:text="RadioButton1" />

您的单独可绘制文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_pressed="true" >
         <shape android:shape="rectangle" >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#333333" />
             <solid android:color="#cccccc" />            
         </shape>
    </item>

    <item android:state_checked="true">
         <shape android:shape="rectangle" >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#333333" />
             <solid android:color="#cccccc" /> 
         </shape>
    </item>  

    <item>
         <shape android:shape="rectangle"  >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#cccccc" />
             <solid android:color="#ffffff" />            
         </shape>
    </item>
</selector>

答案 2 :(得分:10)

我已经更新了接受的答案并删除了不必要的内容。

我已经为下面的图像创建了XML。

enter image description here

您用于RadioButton XML 代码将是:

<RadioGroup
        android:id="@+id/daily_weekly_button_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <RadioButton
            android:id="@+id/radio0"
            android:layout_width="@dimen/_80sdp"
            android:gravity="center"
            android:layout_height="wrap_content"
            android:background="@drawable/radio_flat_selector"
            android:button="@android:color/transparent"
            android:checked="true"
            android:paddingLeft="@dimen/_16sdp"
            android:paddingTop="@dimen/_3sdp"
            android:paddingRight="@dimen/_16sdp"
            android:paddingBottom="@dimen/_3sdp"
            android:text="Daily"
            android:textColor="@color/radio_flat_text_selector" />

        <RadioButton
            android:id="@+id/radio1"
            android:gravity="center"
            android:layout_width="@dimen/_80sdp"
            android:layout_height="wrap_content"
            android:background="@drawable/radio_flat_selector"
            android:button="@android:color/transparent"
            android:paddingLeft="@dimen/_16sdp"
            android:paddingTop="@dimen/_3sdp"
            android:paddingRight="@dimen/_16sdp"
            android:paddingBottom="@dimen/_3sdp"
            android:text="Weekly"
            android:textColor="@color/radio_flat_text_selector" />

</RadioGroup>

radio_flat_selector.xml用于背景选择器:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/radio_flat_selected" android:state_checked="true" />
    <item android:drawable="@drawable/radio_flat_regular" />
</selector>

radio_flat_selected.xml用于所选按钮:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners
        android:radius="1dp"
        />
    <solid android:color="@color/colorAccent" />
    <stroke
        android:width="1dp"
        android:color="@color/colorAccent" />
</shape>

radio_flat_regular.xml(用于常规选择器):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="1dp" />
    <solid android:color="#fff" />
    <stroke
        android:width="1dp"
        android:color="@color/colorAccent" />
</shape>

以上所有3个文件代码都将位于drawable/文件夹中。

现在我们还需要Text颜色选择器来相应地更改文本的颜色。

radio_flat_text_selector.xml用于文本颜色选择器

(为此文件使用color/文件夹。)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_checked="false" />
    <item android:color="@color/colorWhite" android:state_checked="true" />
</selector>

注意:对于这种类型的解决方案,我参考了很多答案,但是没有找到好的解决方案,所以我做到了。

希望对您有帮助。

谢谢。

答案 3 :(得分:8)

您必须使用XML可绘制路径( my_checkbox )填充“CompoundButton”类的“Button”属性。 在XML drawable中,您必须具有:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_checked="false" android:drawable="@drawable/checkbox_not_checked" />
     <item android:state_checked="true" android:drawable="@drawable/checkbox_checked" />
     <item android:drawable="@drawable/checkbox_not_checked" /> <!-- default -->
</selector>

请不要忘记将PNG格式的文件名替换为 my_checkbox checkbox_not_checked ,这是您未选中的复选框,并且 checkbox_checked 在您的图片被检查时。

对于尺寸,直接更新布局参数。

答案 4 :(得分:5)

为了隐藏默认的单选按钮,我建议remove the button而不是让它透明,因为所有视觉反馈都是由可绘制的背景处理的:

android:button="@null"

由于有几个单选按钮,use styles也会更好:

<RadioButton style="@style/RadioButtonStyle" ... />

<style name="RadioButtonStyle" parent="@android:style/Widget.CompoundButton">
    <item name="android:background">@drawable/customButtonBackground</item>
    <item name="android:button">@null</item>
</style>

您也需要Seslyn customButtonBackground drawable

答案 5 :(得分:5)

像接受的答案那样设置RadioButton的android:backgroundandroid:button对我不起作用。可绘制图像被显示为单选按钮文本的背景(尽管android:button被设置为透明),enter image description here

android:background="@drawable/radiobuttonstyle"
    android:button="@android:color/transparent"

因此给了单选按钮作为自定义可绘制的radiobuttonstyle.xml

<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Maintenance"
    android:id="@+id/radioButton1"
    android:button="@drawable/radiobuttonstyle"
      />

和radiobuttonstyle.xml如下

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_checked="true" android:drawable="@drawable/ic_radio_checked"></item>
  <item android:state_checked="false" android:drawable="@drawable/ic_radio_unchecked"></item>
</selector>

,此具有自定义按钮样式的单选按钮起作用之后。

enter image description here

答案 6 :(得分:4)

添加自定义drawable的最佳方法是:

 <RadioButton
                                android:id="@+id/radiocar"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:background="@android:color/transparent"
                                android:button="@drawable/yourbuttonbackground"
                                android:checked="true"
                                android:drawableRight="@mipmap/car"
                                android:paddingLeft="5dp"
                                android:paddingRight="5dp"
                                android:text="yourtexthere"/>

此处删除了自定义drawable的阴影叠加。

答案 7 :(得分:3)

简单的方法试试这个

  1. 在drawable文件夹中创建一个新布局并将其命名为custom_radiobutton(您也可以重命名)

     <?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android" >
     <item android:state_checked="false" 
    android:drawable="@drawable/your_radio_off_image_name" />
     <item android:state_checked="true" 
    android:drawable="@drawable/your_radio_on_image_name" />
    </selector>
    
  2. 在布局活动

    中使用此功能
    <RadioButton
     android:id="@+id/radiobutton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:button="@drawable/custom_radiobutton"/>
    

答案 8 :(得分:1)

下面的代码是自定义单选按钮的示例。按照以下步骤..

  1. Xml文件。

      

                        <FrameLayout
                            android:layout_width="0dp"
                            android:layout_height="match_parent"
                            android:layout_weight="0.5">
    
    
                            <TextView
                                android:id="@+id/text_gender"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="left|center_vertical"
                                android:gravity="center"
                                android:text="@string/gender"
                                android:textColor="#263238"
                                android:textSize="15sp"
                                android:textStyle="normal"
    
                                />
    
                            <TextView
                                android:id="@+id/text_male"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:layout_marginLeft="10dp"
                                android:gravity="center"
                                android:text="@string/male"
                                android:textColor="#263238"
                                android:textSize="15sp"
                                android:textStyle="normal"/>
    
                            <RadioButton
                                android:id="@+id/radio_Male"
                                android:layout_width="28dp"
                                android:layout_height="28dp"
                                android:layout_gravity="right|center_vertical"
                                android:layout_marginRight="4dp"
                                android:button="@drawable/custom_radio_button"
                                android:checked="true"
                                android:text=""
                                android:onClick="onButtonClicked"
                                android:textSize="15sp"
                                android:textStyle="normal"
    
                                />
                        </FrameLayout>
    
                        <FrameLayout
                            android:layout_width="0dp"
                            android:layout_height="match_parent"
                            android:layout_weight="0.6">
    
                            <RadioButton
                                android:id="@+id/radio_Female"
                                android:layout_width="28dp"
                                android:layout_height="28dp"
                                android:layout_gravity="right|center_vertical"
                                android:layout_marginLeft="10dp"
                                android:layout_marginRight="0dp"
                                android:button="@drawable/custom_female_button"
                                android:text=""
                                android:onClick="onButtonClicked"
                                android:textSize="15sp"
                                android:textStyle="normal"/>
    
                            <TextView
                                android:id="@+id/text_female"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="left|center_vertical"
                                android:gravity="center"
                                android:text="@string/female"
                                android:textColor="#263238"
                                android:textSize="15sp"
                                android:textStyle="normal"/>
    
                            <RadioButton
                                android:id="@+id/radio_Other"
                                android:layout_width="28dp"
                                android:layout_height="28dp"
                                android:layout_gravity="center_horizontal|bottom"
                                android:layout_marginRight="10dp"
                                android:button="@drawable/custom_other_button"
                                android:text=""
                                android:onClick="onButtonClicked"
                                android:textSize="15sp"
                                android:textStyle="normal"/>
    
                            <TextView
                                android:id="@+id/text_other"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="right|center_vertical"
                                android:layout_marginRight="34dp"
                                android:gravity="center"
                                android:text="@string/other"
                                android:textColor="#263238"
                                android:textSize="15sp"
                                android:textStyle="normal"/>
                        </FrameLayout>
                    </LinearLayout>
    

    2.添加单选按钮的自定义xml

    2.1。其他可绘制的

    custom_other_button.xml

    <item android:state_checked="true" android:drawable="@drawable/select_radio_other" />
    <item android:state_checked="false" android:drawable="@drawable/default_radio" />
    

    2.2.female drawable

    custom_female_button.xml

    <item android:state_checked="true" android:drawable="@drawable/select_radio_female" />
    <item android:state_checked="false" android:drawable="@drawable/default_radio" />
    

    2.3。男性可画的

    custom_radio_button.xml

    <item android:state_checked="true" android:drawable="@drawable/select_radio_male" />
    <item android:state_checked="false" android:drawable="@drawable/default_radio" />
    

    1. 输出: this is the output screen

答案 9 :(得分:0)

我意识到这是一个迟来的答案,但通过developer.android.com查看,似乎Toggle按钮非常适合您的情况。

Toggle button image http://developer.android.com/guide/topics/ui/controls/togglebutton.html

当然,您仍然可以使用其他建议来获得背景可绘制以获得您想要的自定义外观。

<ToggleButton 
    android:id="@+id/togglebutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_button_background"
    android:textOn="On"
    android:textOff="Off"
    />

现在,如果你想进行最后的编辑并在按钮周围产生“光环”效果,你可以使用另一个自定义选择器来做到这一点。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" > <!-- selected -->
        <shape>
            <solid
                android:color="@android:color/white" />
            <stroke
                android:width="3px"
                android:color="@android:color/holo_blue_bright" />
            <corners
                android:radius="5dp" />
        </shape>
    </item>
    <item> <!-- default -->
        <shape>
            <solid
                android:color="@android:color/white" />
            <stroke
                android:width="1px"
                android:color="@android:color/darker_gray" />
            <corners
                android:radius="5dp" />
        </shape>
    </item> 
</selector>

答案 10 :(得分:0)

有人因为设置自定义按钮不起作用而来到这里吗?我注意到 RadioButton 不起作用,但 androidx.appcompat.widget.AppCompatRadioButton 起作用了。

像这样的单选按钮

 <androidx.appcompat.widget.AppCompatRadioButton
            android:id="@+id/your_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:button="@drawable/radio_button_selector"
            android:text="Your choice" />

使用这样的选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/radio_button_selected" android:state_checked="true" />
    <item android:drawable="@drawable/radio_button_unselected" android:state_checked="false" />
</selector>

会起作用。