0

背景としてドローアブルを持つ TextView があります。StateListDrawable オブジェクトを使用して、プログラムで背景色を設定しようとしていますが、予期しない動作に遭遇しています。あるオブジェクトで色を設定すると、別のオブジェクトで色が変わります。これは不可能なはずです。

関連するコード:

    GradientDrawable notPressed = (GradientDrawable) getResources().getDrawable(R.drawable.rectangle);
    GradientDrawable isPressed = (GradientDrawable) getResources().getDrawable(R.drawable.rectangle);
    isPressed.setColor(util.getColour(api, this));

    StateListDrawable bg = new StateListDrawable();
    // bg.addState(new int[] { android.R.attr.state_pressed }, isPressed);
    bg.addState(StateSet.WILD_CARD, notPressed);

    textView.setBackgroundDrawable(bg);

ドローアブル:

<shape  xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
<stroke android:width="1dp" android:color="@color/divider" />
<solid android:color="@color/background_button" />
</shape>

util.getColourapi の値に基づいてカラー リソースを返します。

奇妙なことに、上記のコードではisPressedドローアブルの色が設定されていますが、その後、このドローアブルは使用されません。代わりに、notPressedドローアブルのみが textView の背景に追加されます。

ただし、textView の背景色は、isPressed代わりにドローアブルの色になります! 同じドローアブル リソースから作成されたとしても、これらは 2 つの異なるオブジェクトである必要があるため、これは不可能です。

4

2 に答える 2

1

リソースを取得すると、同じ参照を取得できると思います。したがってnotPressed、とisPressedは同じオブジェクトです。どこかにクローン操作があると思います...

編集:

mutate()はい、変更する前にドローアブルを呼び出す必要があります。Drawableにカラーフィルターを追加すると、同じDrawableを使用するすべてのボタンが変更されるを参照してください。

于 2013-03-20T17:21:10.213 に答える
0

Android は、新しいコピーが必要であると指定しない限り、ドローアブル リソースに同じオブジェクトを使用します。

このコードを使用して、この問題を解決できます。

Drawable isPressed  = notPressed.getConstantState().newDrawable();
于 2013-03-20T17:25:39.050 に答える