更改单选按钮的圆圈颜色


157

我想在我的项目之一中更改RadioButton圆圈的颜色,但我不知道要设置哪个属性。我的背景色是黑色,因此不可见。我想将圆圈的颜色设置为白色。



使用两个图像作为单选按钮,一个被选中,另一个未被选中,通过使用setbackground资源或使用选择器xml在单选按钮上单击此图像。
SAURABH_12 2013年

Answers:


287

更简单,只需设置buttonTint颜色:(仅适用于api级别21或更高)

<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/radio"
    android:checked="true"
    android:buttonTint="@color/your_color"/>

在您的values / colors.xml中,在这种情况下将您的颜色变成红色:

<color name="your_color">#e75748</color>

结果:

彩色的Android单选按钮

如果您想通过代码(也是api 21及更高版本)来执行此操作:

if(Build.VERSION.SDK_INT>=21)
{

    ColorStateList colorStateList = new ColorStateList(
            new int[][]{

                    new int[]{-android.R.attr.state_enabled}, //disabled
                    new int[]{android.R.attr.state_enabled} //enabled
            },
            new int[] {

                    Color.BLACK //disabled
                    ,Color.BLUE //enabled

            }
        );                       


    radio.setButtonTintList(colorStateList);//set the color tint list
    radio.invalidate(); //could not be necessary
}

1
@emaillenin,如果您想通过代码更改色彩,则应使用control.getDrawable().setColorFilter(getResources().getColor(color), PorterDuff.Mode.SRC_IN);where control是要更改色彩的控件,并且color是您想要的颜色的整数值,例如R.color.red
Jorge Arimany

1
@JorgeArimany对于RadioButton,它是getButtonDrawable还是getCompoundDrawables?getCompoundDrawables返回列表
Lenin Raj Rajasekaran

@emaillenin,谢谢,我对您的评论的回答是对其他控件(如按钮)的支持,我已经通过添加所需代码来升级我的回答,希望对您
有所

3
@JorgeArimany我已经为> 21工作。.我正在寻找专门针对<21
Lenin Raj Rajasekaran的

要更改选中按钮的颜色,可以添加或替换状态,android.R.attr.state_checked然后添加颜色。
6

159

更新: 1.改用这个

   <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbtn_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:buttonTint="@color/primary" />

2.然后将此行添加到父级布局或Alt + Enter在Android Studio中自动添加 xmlns:app="http://schemas.android.com/apk/res-auto"

最小示例应如下所示:

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

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbtn_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:buttonTint="@color/primary" />

</LinearLayout>

3.在您的程序中,应这样调用。 AppCompatRadioButton radioButton = (AppCompatRadioButton) view.findViewById(R.id.rbtn_test);

基本上,这种模式可以应用于所有AppCompact类型,例如AppCompatCheckBox,AppCompatButton等。

旧答案:

为了支持以下android API 21,您可以使用AppCompatRadioButton。然后使用setSupportButtonTintList方法更改颜色。这是我创建单选按钮的代码段。

    AppCompatRadioButton rb;
    rb = new AppCompatRadioButton(mContext);

    ColorStateList colorStateList = new ColorStateList(
            new int[][]{
                    new int[]{-android.R.attr.state_checked},
                    new int[]{android.R.attr.state_checked}
            },
            new int[]{

                    Color.DKGRAY
                    , Color.rgb (242,81,112),
            }
    );
    rb.setSupportButtonTintList(colorStateList);

API 19的测试结果:

这是经过API 19测试的

详情请参阅android 参考链接


10
这个答案应该是公认的。如果要通过xml添加此支持单选按钮,请使用<android.support.v7.widget.AppCompatRadioButton ../>
Vinayak Garg,2016年

22
setSupportButtonTintList是您不打算使用的私有方法。在某些版本的Android上,单选按钮的行为会很奇怪。而是使用CompoundButtonCompat.setButtonTintList(rb, colorStateList)
wampastompa

2
@wampastompa是正确的。在API 22上,结果是我只看到一个外圈,在检查时从未填充。@aknay; 请更新您的答案
Nino van Hooff '16

1
我使用的是API16。我添加了上面列出的AppCompat单选按钮,但是仍然无法正确显示。
tccpg288 '16

1
您不需要任何代码,请参阅IgorOliveira的答案。适用于所有版本。
基里尔·卡马津

77
<android.support.v7.widget.AppCompatRadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:buttonTint="@color/Color" />

11
这是之前,当前和之后的棒棒糖设备的答案!!很棒
sdelvalle57 '16

1
这应该是公认的答案。简短而完美。注意:请使用app:buttonTint =“ @ color / Color”,但不能使用andoid:buttonTint =“ @ color / Color”!
Kirill Karmazin

@KirillKarmazin应当适用于<21
user924 '17

56

在API的工作预先21以及21后 在你styles.xml放:

<!-- custom style -->
<style name="radionbutton"
       parent="Base.Widget.AppCompat.CompoundButton.RadioButton">
    <item name="android:button">@drawable/radiobutton_drawable</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:backgroundDimEnabled">true</item>
</style>

radio button的xml应该如下所示:

<RadioButton
    android:layout_width="wrap_content"
    style="@style/radionbutton"
    android:checked="false"
    android:layout_height="wrap_content"
    />

现在您需要做的就是radiobutton_drawable.xml在您的计算机中创建一个drawable folder。这是您需要放入的内容:

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

您的radio_unchecked.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="oval">
  <stroke android:width="1dp" android:color="@color/colorAccent"/>
  <size android:width="30dp" android:height="30dp"/>
</shape>

您的radio_checked.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
    <shape android:shape="oval">
      <stroke android:width="1dp" android:color="@color/colorAccent"/>
      <size android:width="30dp" android:height="30dp"/>
    </shape>
  </item>
  <item android:top="5dp" android:bottom="5dp" android:left="5dp" android:right="5dp">
    <shape android:shape="oval">
      <solid android:width="1dp" android:color="@color/colorAccent"/>
      <size android:width="10dp" android:height="10dp"/>
    </shape>
  </item>
</layer-list>

只需替换@color/colorAccent为您选择的颜色即可。


我将如何以编程方式执行此操作?
tccpg288 '16

@ tccpg288如果使用此xml,并且要以编程方式更改颜色,则只需使用radioButton.setChecked(false)或radioButton.setChecked(true)
Vaibhav Sharma,

我不明白你的问题。您能详细说明一下吗?
Vaibhav Sharma

我的错误,是否使用常规RadioButton或AppCompat RadioButton无关紧要?
tccpg288 '16

1
它不起作用,当我初始化RadioButton时该怎么办?这是我的代码:mPollAnswerArrayList.add((indexCreated),new RadioButton((getActivity()。getApplicationContext()),null,R.style.radiobutton));
tccpg288 '16

18

您必须使用以下代码:

<android.support.v7.widget.AppCompatRadioButton
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:buttonTint="@color/black"
                    android:text="Radiobutton1"
                    app:buttonTint="@color/black" />

使用app:buttonTint代替android:buttonTint和也android.support.v7.widget.AppCompatRadioButton代替Radiobutton


16
  1. 在styles.xml文件中声明自定义样式。

    <style name="MyRadioButton" parent="Theme.AppCompat.Light">  
      <item name="colorControlNormal">@color/indigo</item>
      <item name="colorControlActivated">@color/pink</item>
    </style>  
  2. 通过android:theme属性将此样式应用于您的RadioButton。

    <RadioButton  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="Radio Button"
        android:theme="@style/MyRadioButton"/>

    仅当您的活动扩展时 AppCompatActivity


1
这应该作为答案接受,它适用于所有版本,并且最干净
Antonis Radz

我不得不用<item name="android:colorControlActivated">@color/pink</item>它来为我工作。我仍然不确定为什么。否则,这是一个很好的答案。
Taylor Venissat

16

适用于API 21

创建自定义样式RadioButton style.xml

 <style name="RadioButton" parent="Theme.AppCompat.Light">
     <item name="colorAccent">@color/green</item>
     <item name="android:textColorSecondary">@color/mediumGray</item>
     <item name="colorControlNormal">@color/red</item>
 </style>

在布局中使用主题:

<RadioButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:theme="@style/RadioButton" />

适用于API 21及更高版本

只需使用buttonTint

 <RadioButton
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:buttonTint="@color/green" />

应该澄清:buttonTint适用于API 21 使用AppCompat / AndroidX的应用程序,无论使用API
Chisko,

12

这个问题很老,但我认为我的回答会帮助人们。您可以通过使用xml中的样式来更改单选按钮的未选中状态和选中状态的颜色。

<RadioButton
    android:id="@+id/rb"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:theme="@style/RadioButtonStyle" />

在style.xml中

<style name="RadioButtonStyle" parent="Theme.AppCompat.Light">
        <item name="colorAccent">@android:color/white</item>
        <item name="android:textColorSecondary">@android:color/white</item>
</style>

您可以使用这种样式设置所需的颜色。


RadioButton内部的主题不起作用(是吗?)。单击按钮时,它会崩溃,因为尽管在这里,但未找到onClick方法。
Bevor

这个问题还有其他原因。在对该视图实施onClick之前,请确保获取正确的视图ID。
Jaura

9

设置buttonTint属性。例如,android:buttonTint="#99FF33"


9
仅在API 21之后
奇迹多

7

我做了这样简短的介绍(在API 21之前和21上工作)

xml中的单选按钮应如下所示

  <RadioButton android:id="@+id/radioid"                    
                android:layout_height="wrap_content"
                android:layout_width="wrap_content"                 
                android:button="@drawable/radiodraw" />

在radiodraw.xml中

  <?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android">    
      <item android:state_checked="false" >
          <shape  android:shape="oval" >
              <stroke android:width="1dp" android:color="#000"/>
              <size android:width="30dp" android:height="30dp"/>
              <solid android:color="@android:color/transparent"/>
          </shape>
      </item>
      <item android:state_checked="true">
          <layer-list>
              <item>
                  <shape android:shape="oval">
                      <stroke android:width="1dp" android:color="#000"/>
                      <size android:width="30dp" android:height="30dp"/>
                      <solid android:color="@android:color/transparent"/>
                  </shape>
              </item>
              <item android:top="5dp" android:bottom="5dp" android:left="5dp" android:right="5dp">
                  <shape android:shape="oval">
                      <solid android:width="1dp" android:color="#000"/>
                      <size android:width="10dp" android:height="10dp"/>
                  </shape>
              </item>
          </layer-list>
      </item>
  </selector>

必须添加透明颜色以绘制未选中状态;否则将绘制纯黑色椭圆形。


6

有时您只需要像这样重写colorControlNormal

    <style name="RadioButtonStyle" parent="AppTheme">
       <item name="colorControlNormal">@color/pink</item>
       <item name="colorAccent">@color/colorPrimary</item>
       <item name="android:textColorSecondary">@color/black</item>
    </style>

然后您将获得如下所示的按钮:

在此处输入图片说明

colorControlNormal用于未检查状态,而colorAccent用于已检查。


5

有一个xml属性:

android:buttonTint="yourcolor"

确保您的最低API高于21,否则将无法正常工作
-Jcorretjer,

您可以使用它来实现向后兼容性:app:buttonTint =“ your_color”
Mridul Das

"Make sure your min API is higher then 21 or this won't work"那是错误的。我将Android 17定位为API 17,这是唯一对我
有用的

3

对于那些想要更改禁用,已检查和启用状态的用户,请执行以下步骤:

<!-- Or androidX radio button or material design radio button -->
<android.support.v7.widget.AppCompatRadioButton
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:buttonTint="@color/black"
                    android:text="Radiobutton1"
                    app:buttonTint="@color/radio_button_color" />

然后在color res文件夹中创建一个名为“ radio_button_color.xml”的文件:

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

2
<RadioButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/radio"
    android:buttonTint="@color/my_color"/>

全部按钮将更改颜色,圆圈框和中央复选框。


1
但不是涟漪;-)
Waza_Be

1

默认情况下,RadioButton在res / values / colors.xml文件中采用colorAccent的颜色。因此,转到该文件并更改

<color name="colorAccent">#3F51B5</color>

到您想要的颜色。


0

最简单的方法是更改 colourAccent颜色,values->colours.xml
但要注意,它也会更改其他内容,例如编辑文本光标的颜色等。

< color name="colorAccent">#75aeff</color >


0

如果要为单击和未单击的单选按钮设置不同的颜色,请使用:

   android:buttonTint="@drawable/radiobutton"  in xml of the radiobutton and your radiobutton.xml will be:  
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="#1E88E5"/>
<item android:state_checked="true" android:color="#00e676"/>
<item android:color="#ffffff"/>


0

只需android:buttonTint="@color/colorPrimary"在标签上使用属性,希望对您有所帮助


0

我有这个问题。如果您的应用程序具有黑色背景,并且您有很多由于背景不可见的RadioButtons,则编辑每个android:buttonTint会很复杂,最好的解决方案是在styles.xml文件中更改父主题

我变了

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

因此,RadioButton的圆圈变成了较浅的灰色阴影,现在即使在黑色背景下也可以看到。

这是我的style.xml文件:

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>


-4

@ jh314是正确的。在AndroidManifest.xml中,

 <application
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"></application>

在style.xml中

  <!-- Application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorAccent">@color/red</item>
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>

项目名称必须为colorAccent,它决定了应用程序小部件的默认颜色。

但是,如果您想更改代码中的颜色,@ aknay的答案也许是正确的。


这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;而是提供不需要问询者澄清的答案。- 评分
semirturgay

我的答案是更改应用程序的基本颜色,当然也可以将单选按钮的颜色更改为白色。
Iturbo '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.