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

我试图得到单选按钮效果的普通按钮在机器人

我有一个简单的机器人单选按钮下面

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 }更多的变化

最后的变化应该至少我应该知道哪个按钮,我已经选择了三个单选按钮..。有可能得到下面这样的结果吗?

enter image description here

252334 次浏览

添加一个引用图像或选择器的背景绘制工具(如下图) ,并使按钮透明:

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

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

Res/draable/yourbuttonbackound.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>

在上面的选择器中,我们引用了两个绘图,ab,以下是我们如何创建它们:

Res/draable/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/draable/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>

更多有关绘图的资料: http://developer.android.com/guide/topics/resources/drawable-resource.html

必须用 XML 可绘制路径(我的复选框)填充“ CompoundButton”类的“ Button”属性。 在 XML 绘图中,您必须具有:

<?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>

不要忘记将 我的复选框替换为复选框绘制的文件名,将 复选框 _ not _ check替换为 PNG 绘制的文件名,PNG 绘制的文件名是未选中的复选框,复选框 _ 勾选替换为选中的图像。

对于大小,直接更新布局参数。

使用与 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>

我知道这是一个迟到的回答,但是从 developer.android.com 来看,切换按钮似乎对你的情况非常理想。

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>

为了隐藏默认的单选按钮,我建议使用 把按钮拿开而不是使其透明,因为所有的视觉反馈都由可绘制的背景处理:

android:button="@null"

此外,这将是更好的 使用样式,因为有几个单选按钮:

<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>

你也需要 背景绘制

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

<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"/>

通过自定义绘图的阴影覆盖在这里被删除。

简单的方法试试这个

  1. 在可绘制文件夹中创建一个新的布局,并将其命名为 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"/>
    

下面的代码是自定义单选按钮的示例。请按照下面的步骤操作。

  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>
    

为单选按钮添加自定义 xml

2.1其他可绘制

Custom_ other _ button.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/select_radio_other" />
<item android:state_checked="false" android:drawable="@drawable/default_radio" />


</selector>

2.2. 女性可绘制

Custom_ women _ button.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/select_radio_female" />
<item android:state_checked="false" android:drawable="@drawable/default_radio" />


</selector>

2.3男性可绘制

Custom_ radio _ button.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/select_radio_male" />
<item android:state_checked="false" android:drawable="@drawable/default_radio" />
</selector>
  1. 产出: 这是输出屏幕

设置 android:backgroundandroid:button的收音机按钮像接受的答案不适合我。可绘制的图像被显示为单选按钮文本的背景(尽管 android:button被设置为透明)enter image description here

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

因此给出了单选按钮作为定制的可绘制单选按钮 style.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

我已经更新了接受的答案和删除不必要的东西。

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

enter image description here

你的 RadioButton代码是:

<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>

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

希望对你有所帮助。

谢谢。

有人来这里是因为设置一个自定义按钮不起作用吗?我注意到 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>

会成功的。

DR 使用 android:drawableStart作为我们的自定义可绘制选择器文件,而不是 android:button:

android:button="@null"
android:drawableStart="@drawable/radio_selector"

长版本 :

我不知道原因,但是当我在一个运行 Android 11(API 级别30)的设备上测试它时,这里现有的答案对我不起作用。所以尝试了下面的替代方法或者黑客技术,结果奏效了。 单选按钮组件的 xml 示例供参考:

<RadioButton
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:drawableStart="@drawable/radio_selector"
android:drawablePadding="5dp"
android:text="@string/radioOption1" />

我们正在使用 android:drawableStart为我们的自定义绘制图像的收音机或选择器的选中图标,而不是 android:button。别忘了把 android:button调到 @null