3

私が現在経験しているこの苛立たしい問題について誰かが私を助けてくれることを願っています:私はボタンの1つにStateListDrawableをプログラムで追加しようとしています:

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

クラス MyStateListDrawable 自体が 2 つの LayerDrawable を追加します。1 つはボタンの通常の状態用で、もう 1 つはボタンが無効または押された状態のときに表示されます。

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

LayerDrawable は 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;
    }
}

ここで、アクティビティを実行すると、ボタンのデフォルト状態が適切にレンダリングされますが、ボタンを無効にするか押すと、スタイルは 2 番目の LayerDrawable defined に変更されません。XML ファイルを介してボタンにプロパティを追加すると、問題なく動作しますが、現在 30 以上の XML ファイルがあり (それぞれ色やサイズに関するスタイルのバリエーションはほとんどありません)、それらを 1 つに動的に作成すると非常に便利です。すべてのボタンのクラス。この問題の原因を知っている人はいますか?

4

1 に答える 1

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));
}
....
于 2014-10-08T13:46:04.347 に答える