我可以使用相同的“radioButton_states”drawable并创建一个每个按钮具有不同背景颜色的radioGroup吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用相同的“radioButton_states”drawable并创建一个每个按钮具有不同背景颜色的radioGroup吗?相关的知识,希望对你有一定的参考价值。

我正在尝试为每个单选按钮“未选中”状态创建一个具有不同颜色的radioGroup。

例如。 enter image description here

目前我有。

CreateRadioButtonsRow()尝试在RadioButtons中创建一行RadioGroup作为linearLayout

 ColorChooser.java (important function from class)

private Dialog colorChooserDialog;
private Context context;

private LinearLayout linearLayoutColors;
private int[] colorChooserColors;
private Drawable radioButtonBackground;


 private void CreateRadioButtonRow()
{
    final RadioButton [] radioButtons = new RadioButton[6];
    RadioGroup radioGroup = new RadioGroup(context);
    radioGroup.setOrientation(RadioGroup.HORIZONTAL);

    for (int i = 0; i < 5; i++)
    {
        radioButtons[i] = new RadioButton(context);
        setDrawableBackgroundColor(colorChooserColors[i]);
        radioButtons[i].setBackgroundResource(R.drawable.radio_button_states);
        radioButtons[i].setButtonDrawable(R.drawable.null_selector);
        radioGroup.addView(radioButtons[i]);
    }
    linearLayoutColors.addView(radioGroup);
}

private void setDrawableBackgroundColor(int color)
{
    if (radioButtonBackground instanceof ShapeDrawable)
    {
        ((ShapeDrawable)radioButtonBackground).getPaint().setColor(color);
    }
    else if (radioButtonBackground instanceof GradientDrawable)
    {
        ((GradientDrawable)radioButtonBackground).setColor(color);
    }
}

radio_button_states.xml包含已选中和未选中的drawable。

radio_button_states.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/color_radio_button_enabled"/>

    <item android:state_checked="false"
        android:drawable="@drawable/color_radio_button_background"/>
</selector>

color_radio_button_enabled.xml是启用状态,它基本上是未经检查的圆形,周围有白色环。

color_radio_button_enabled.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/color_radio_button_background"/>
    <item android:drawable="@drawable/selected_ring"/>
</layer-list>

Selected_Ring.xml是白色环层

selected_ring.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="2"
    android:thickness="2dp"
    android:useLevel="false">
    <size
        android:width="40dp"
        android:height="40dp" />
    <solid
        android:color="#ffffff"/>
</shape>

color_radio_button_background.xml是一个彩色圆圈。

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

colors.xml用于填充int [] colorChooserColors

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="c0" type="color">#ff9999</item>
    <item name="c1" type="color">#ff4d4d</item>
    <item name="c2" type="color">#ff0000</item>
    <item name="c3" type="color">#cc0000</item>
    <item name="c4" type="color">#990000</item>
    <item name="c5" type="color">#660000</item>
    <integer-array name="array_chooser_colors">
        <item>@color/c0</item>
        <item>@color/c1</item>
        <item>@color/c2</item>
        <item>@color/c3</item>
        <item>@color/c4</item>
        <item>@color/c5</item>
    </integer-array>
</resources>

这产生的是:

enter image description here

似乎颜色永远不会被保存,radio_button_states只使用最后设置的颜色。

我是否需要为每个按钮设置不同的drawable button_states?或者有没有办法可以将每个彩色背景保存到每个radioButton的setBackgroundResource(R.drawable.radio_button_states)

答案

所有资源抽屉(R.drawable。*)本质上都是静态的,因此当您使用getPaint().setColor(color)为一个RadioButton更改颜色时,它将针对所有这些更改。

我无法完全掌握你在使用instanceOf代码所做的事情,因为看起来你只是使用形状Drawables,所以我没有一个完整的解决方案......但我有一个方法给你。

而不是使用Resource Drawables,为每个按钮创建一个新的Drawable实例。例如,将private void setDrawableBackgroundColor(int color)更改为接受RadioButton,并动态附加新的背景Drawable。看这里:

//------------------
for (int i = 0; i < 5; i++)
{
    radioButtons[i] = new RadioButton(context);

    //The line below is undoing the setDrawableBackgroundColor line
    //radioButtons[i].setBackgroundResource(R.drawable.radio_button_states);

    //Didn't have the file for this one...
    //radioButtons[i].setButtonDrawable(R.drawable.null_selector);

    //Notice how now we pass a RadioButton to the below method
    setDrawableBackgroundColor(colorChooserColors[i], radioButtons[i]);

    radioGroup.addView(radioButtons[i]);
}
//------------------
private void setDrawableBackgroundColor(int color, RadioButton radio) {

    //We are now creating a new ShapeDrawable instance for each individual 
    //button - so now they will all have their own individual Drawable, 
    //rather than sharing the same static one.

    Drawable radioButtonBackground = new ShapeDrawable(new OvalShape());

    ((ShapeDrawable) radioButtonBackground).getPaint().setColor(color);

    radio.setBackground(radioButtonBackground);
}

我认为这不会完全解决你的问题,但我希望它能让你朝着正确的方向前进。我尝试了上面的代码并获得了以下结果(我稍微调整了colors.xml以获得效果)。

My emulator with your code, tweaked

以上是关于我可以使用相同的“radioButton_states”drawable并创建一个每个按钮具有不同背景颜色的radioGroup吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用啥算法来计算有多少学生的分数相同?

当我可以从静态实现相同的目标时,为啥我需要使用动态内存分配?

我可以使用传递不同 UIViewController 子类的相同方法吗?

我可以同时使用相同的登录名进行视频对话和文本对话吗?

我可以在 Parallel.For 循环中使用相同的函数委托吗

我可以使用 Kotlin 合成扩展让两个 xml 布局使用相同的视图吗?