以编程方式将带有 LayerDrawable 的 StateListDrawable 添加到按钮的问题

Posted

技术标签:

【中文标题】以编程方式将带有 LayerDrawable 的 StateListDrawable 添加到按钮的问题【英文标题】:Issue with adding a StateListDrawable with LayerDrawable to a Button programmatically 【发布时间】:2013-08-13 17:52:23 【问题描述】:

我希望任何人都可以帮助我解决我目前遇到的这个令人沮丧的问题:我尝试以编程方式将 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 defined 。当我通过 XML 文件将属性添加到我的按钮时,它们工作得很好,但我目前已经有 30 多个 XML 文件(每个文件在颜色或大小方面几乎没有样式变化),并且在一个中动态创建它们会非常好所有按钮的类。有谁知道是什么导致了这个问题?

【问题讨论】:

【参考方案1】:

我终于找到时间回到这个问题上。在尝试了很多不同的可能性之后,我通过为每个状态(按下按钮和禁用按钮时)单独添加相同的可绘制对象(!)来实现它。其他州通过为其他州添加通配符的可绘制对象覆盖。

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

....

【讨论】:

以上是关于以编程方式将带有 LayerDrawable 的 StateListDrawable 添加到按钮的问题的主要内容,如果未能解决你的问题,请参考以下文章

Android:以编程方式将颜色设置为 ProgressBar

Kotlin - 将 Kotlin 方法转换为 Java 以用于 LayerDrawable 的问题

以编程方式更改图层列表可绘制项的底部属性

LayerDrawable OutOfMemoryError

以编程方式将 NSLayoutAttributeLeading Space 设置为 Superview 并带有一些警告

如何以编程方式将带有证书链的 pfx 导入证书存储区?