我希望任何人都能帮助我解决我目前遇到的这个令人沮丧的问题:我试图通过编程将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文件(每个文件在颜色或大小方面都有一些样式变化),在一个类中为所有按钮动态创建它们将是非常好的。有人知道是什么导致了这个问题吗?
我终于找到了一些时间来讨论这个问题。在尝试了很多不同的可能性后,我通过为每个状态(当按钮被按下和被禁用时)单独添加相同的可绘制内容(!)来实现它。其他州通过一张可抽彩卡覆盖,并为其他州添加一张外卡。
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));
}
....