1

私はこれを持っています:

round_button.xml

<xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
    <shape android:shape="oval">
        <solid android:color="#dec60000"/>
        <size android:width="150dp" android:height="150dp"/>
    </shape>
</item>
<item android:state_pressed="false">
    <shape android:shape="oval">
        <solid android:color="#860000"/>
        <size android:width="150dp" android:height="150dp"/>
    </shape>
</item>

マイボタン:

 <Button
        android:id="@+id/incrementBTN"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:background="@drawable/round_button"
        android:onClick="onClick"
        android:soundEffectsEnabled="true"
        android:text="0"
        android:textSize="50sp"
        tools:ignore="HardcodedText" />

動的に、背景色 ( round_button xml で定義されている)をプログラムで変更したいと考えています。これを行う方法はありますか?

4

3 に答える 3

2

ボタンの特定の状態を定義したい場合は、プログラムで実行することなく、それらをすべてxmlで設定できます(そうする場合、実際にフィルターを設定できますが、多くの状態と条件IMOがあると面倒になる可能性があります)。

ここで手順を詳しく説明します。

1) 必要な状態で xml を作成する

定義された状態を使用して、ドローアブル フォルダーにセレクターを使用して xml を作成できます。例として、

button_bkg.xml

<?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/bkg_is_pressed" android:state_pressed="true"/>
        <item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false"/>
        <item android:drawable="@drawable/bkg_default"/>
</selector>

このファイルをbutton_bkg.xmlとしましょう。上記の例では、pressed 、disabled、および defaultの3 つの状態をリストしました。つまり、ボタンが押されると、bkg_is_pressed バックグラウンドが想定され、ボタンを無効に設定すると (xml で、または setEnabled を介してプログラムで) (ブール値)、bkg_is_disabled バックグラウンドを想定します。

2) 背景の作成

ここで、定義した xml ファイル (bkg_is_pressed、bkg_is_default、bkg_is_pressed) で背景を何にするかを定義します。あなたの場合、たとえば、 round_button.xml ファイルで定義された各形状を取得し、それらを状態用に定義した xml ファイルのそれぞれに分割します。私の場合、レイヤーリストを定義しました:

bkg_is_pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
    <shape android:shape="rectangle">
            <corners android:radius="@dimen/button_corner_radius"/>
            <solid android:color="@color/color_alert"/>
            <stroke
                 android:width="@dimen/universal_1_pixel"
                    android:color="@color/color_gray_dark"/>
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="@dimen/button_corner_radius"/>
            <solid android:color="@color/color_mask_highlighted"/>
        </shape>
    </item>
</layer-list>

これを各州に対して行います。

API 21+ 用にビルドする場合は、drawables-v21 フォルダーに別の button_bkg.xml ファイルを作成することで波及効果を定義できることに注意してください。これは次のようになります。

button_bkg.xml (drawable-v21 フォルダー内)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bkg_is_disabled" android:state_enabled="false" />
    <item android:drawable="@drawable/bkg_is_pressed" />

波紋を使用するには、以下で説明するように色を定義できます。

bkg_is_pressed.xml (drawable-v21 フォルダー内)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/color_mask_highlighted">
    <item android:drawable="@drawable/bkg_is_default" />
</ripple>

button_bkg.xml と bkg_is_pressed.xml を drawable-v21 フォルダー ファイルに入れるだけです。私の場合、bkg_is_default と bkg_is_disabled.xml は 21+ API と 21-API の両方で同じだったので、drawable-v21 フォルダーには追加せず、drawable フォルダーに作成しただけです。

API 21 を搭載したデバイスが適切に動作するように、通常のドローアブル フォルダーに他のファイルが必要あることを強調したいと思います。

3) その背景をボタンに割り当てる

最後に、その背景をボタンに定義する必要があります。

<Button
    ...
    android:background="@drawable/button_bkg
/>

それで、あなたはそれを持っています。このように、プログラムでスタイルを設定する必要はありません。xml ファイルで (状態に応じて) すべての背景を定義するだけです。しかし、それらをすべてプログラムで設定したい場合は、同じことを行うことができます。setBackground を使用し、定義した xml ファイルを使用して、必要な状態ロジックを適用します (ボタンが押された場合、setBackground(bkg_is_pressed) など)。 )

お役に立てば幸いです。

于 2016-10-22T21:40:26.133 に答える
1

ColorFilter を設定して解決しました:

Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); 
mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY));
myButton.setResource(mDrawable);
于 2016-10-22T05:20:24.450 に答える
0

使用する必要がある色に応じて、コードから形状を構築し、それらから StateListDrawable を作成し、それをボタンの背景として設定できます。

于 2016-10-21T19:56:47.960 に答える