3

我正在 android 中开发一个基本的绘图应用程序,我似乎无法以编程方式为我的单选按钮设置自定义可绘制对象。这些单选按钮由LayerDrawable一个白色ColorDrawable的边框和一个插入的黄色(或任何颜色)ColorDrawable的中心组成。我将它LayerDrawable与另一个(它有黑色边框表示选择)放在StateListDrawable一起以保留RadioButton功能。

但是当我尝试时setButtonDrawable(myDrawable)RadioButton即使我指定了宽度和高度,它也占据了一个非常小的区域30dp

然后当我尝试setButtonDrawable(null)and时setBackground(myDrawable),我RadioButton不再具有它的功能。

这是我的代码

private void setupColorButtons() {
    int[] colors = {Color.RED, Color.GREEN, Color.BLUE,
                    Color.YELLOW, Color.CYAN, Color.MAGENTA};
    int childCount = mColorGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
        RadioButton colorButton = (RadioButton) mColorGroup.getChildAt(i);
        colorButton.setButtonDrawable(createColorButtonDrawable(colors[i]));
    }
}

private Drawable createColorButtonDrawable(int color) {
    ColorDrawable center = new ColorDrawable(color);
    ColorDrawable selBorder = new ColorDrawable(R.color.black);
    ColorDrawable unselBorder = new ColorDrawable(R.color.white);

    LayerDrawable sel = new LayerDrawable(new Drawable[] {selBorder, center});
    sel.setLayerInset(1, 2, 2, 2, 2);
    LayerDrawable unsel = new LayerDrawable(new Drawable[] {unselBorder, center});
    unsel.setLayerInset(1, 2, 2, 2, 2);

    StateListDrawable states = new StateListDrawable();
    states.addState(new int[] {android.R.attr.state_checked}, sel);
    states.addState(new int[] {-android.R.attr.state_checked}, unsel); 
    return states;
}

我已经看过类似的问题,但每个解决方案都需要我创建自定义 xml 样式。我只是想知道是否有人知道如何以StateListDrawable编程方式设置自定义。提前感谢您的帮助!

4

2 回答 2

3

试试这个代码:

StateListDrawable mState1 = new StateListDrawable();
mState1.addState(new int[] { android.R.attr.state_pressed },
    getResources().getDrawable(R.drawable.button3_pressed));
mState1.addState(new int[] { android.R.attr.state_focused },
    getResources().getDrawable(R.drawable.button3_focused));
mState1.addState(new int[] {},
    getResources().getDrawable(R.drawable.button3_up));
myButton.setBackgroundDrawable(mState1);
于 2013-07-25T20:32:59.633 回答
1

这增加了狮子座的答案。如果你想给出一个为假的状态,例如一个禁用的按钮,没有状态——android.R.attr.state_disabled,所以你可以使资源引用为负(在前面加“-”):

state.addState(new int[]{android.R.attr.state_checked, -android.R.attr.state_enabled },...);

于 2015-05-26T11:53:49.297 回答