将StateListDrawable与LayerDrawable以编程方式添加到Button的问题

时间:2013-08-12 12:10:51

标签: android button statelistdrawable layerdrawable

我希望有人可以帮助我解决我目前遇到的这个令人沮丧的问题:我尝试以编程方式将StateListDrawable添加到我的一个按钮中:

final Button btn_footer = (Button)findViewById(R.id.btn_footer);
btn_footer.setBackground(new MyStateListDrawable(this));

MyStateListDrawable类本身添加了两个LayerDrawables;一个用于按钮的常规状态,一个在按钮被禁用或处于按下状态时显示。

public class MyStateListDrawable extends StateListDrawable {

    public MyStateListDrawable(Context c) {
        addState(new int[] {-android.R.attr.state_pressed, -android.R.attr.state_enabled}, getStateDrawable(c,false));
        addState(new int[] {android.R.attr.state_pressed, android.R.attr.state_enabled},  getStateDrawable(c,true));
    }
...

LayerDrawables是在MyStateListDrawable类的getStateDrawable方法中创建的:

...
    public Drawable getStateDrawable(Context c, boolean isTransp){
        GradientDrawable shadowGradient = new GradientDrawable();
        GradientDrawable buttonGradient = new GradientDrawable();
        [...]

        Drawable[] drawableArray = {shadowGradient, buttonGradient};
        LayerDrawable layerDrawable = new LayerDrawable(drawableArray);

        if(isTransp)
            layerDrawable.setAlpha(0x88);

        return layerDrawable;
    }
}

现在,当我运行活动时,按钮的默认状态会正确呈现,但如果我尝试禁用或按下按钮,则样式不会更改为定义的第二个LayerDrawable。当我通过XML文件将属性添加到我的按钮时,它们工作得很好,但我目前已有30多个XML文件(每个文件的颜色或大小都有很少的样式变化),并且在一个动态创建它们会非常好所有按钮的类。有人知道造成这个问题的原因吗?

1 个答案:

答案 0 :(得分:0)

我终于找到了一些时间来回到这个问题。在尝试了很多不同的可能性后,我通过为每个状态单独添加相同的drawable(!)(按下按钮和禁用按钮时)。其他州通过一个为其他州添加外卡的抽签覆盖。

public MyStateListDrawable(Context c) {
    addState(new int[] {android.R.attr.state_pressed}, getStateDrawable(c, true));
    addState(new int[] {-android.R.attr.state_enabled}, getStateDrawable(c, true));
    addState(StateSet.WILD_CARD,  getStateDrawable(c, false));
}
....