1

我有這樣的:在xml中爲按鈕定義自定義形狀。現在我想動態改變顏色。怎麼樣?

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" /> 

動態,我想改變背景顏色(這在ro中定義und_button xml以編程方式。有什麼辦法可以做到這一點?

+0

我相信不是。如果你改變顏色,它將取代背景。無論您想要更改哪種顏色,都必須使用不同顏色的第二種XML,並且您可以在Java –

+0

@ th3pat3l Wow中將該XML更改爲背景。 Bravo Google,使用您的SDK進行操作非常簡單。 –

+0

你想改變特定事件的背景顏色嗎?例如,當按鈕被點擊時,當按鈕被聚焦或者按鈕被徘徊時?什麼是實際使用? –

回答

0

我解決它通過設置ColorFilter:

Drawable mDrawable = context.getResources().getDrawable(R.drawable.balloons); 
mDrawable.setColorFilter(new PorterDuffColorFilter(0xffff00,PorterDuff.Mode.MULTIPLY)); 
myButton.setResource(mDrawable); 
-1

您可以根據需要使用的顏色構造代碼中的形狀,並從中創建StateListDrawable並將其設置爲按鈕背景。

+0

我解決了我自己的問題,但是如果你解釋你的答案並給出一個例子,我會給你一個+1 –

2

如果要定義某些狀態爲您的按鈕,你可以將它們都在XML中,而不必做編程方式(如果你做,你確實可以設置一個過濾器,但如果你有很多狀態和條件,它會變得混亂)。

我會在這裏詳細的步驟:你想

您可以在繪製文件夾中創建一個選擇器的XML與定義的狀態

1)創建與狀態的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。在上面的例子中,我列出了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+,你可以通過在你的可繪製-V21夾中其他button_bkg.xml文件中定義一個連鎖反應,這將是這個樣子是很重要的:

button_bkg.xml(在繪製-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(在繪製-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到您的繪製-V21夾文件。就我而言,bkg_is_default和bkg_is_disabled.xml對於21+和21-API都是相同的,所以我沒有將它添加到我的drawable-v21文件夾中,我只是在可繪製文件夾中創建它。

我想強調一下,你仍然需要其他文件在您的常規可繪製文件夾,以便設備與API 21 - 將正常工作。

3)分配這樣的背景下,以你的按鈕

最後,你只需要定義背景的按鈕:

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

所以,你有它。這樣,您不需要以編程方式設置樣式,只需在xml文件中定義所有背景(根據您的狀態)即可。 但是,如果您還希望以編程方式設置它們,則可以使用setBackground並使用您定義的xml文件並應用所需的狀態邏輯(如果按下按鈕,則setBackground(bkg_is_pressed)等) )

我希望有幫助,讓我知道如果這對你有用。

+0

@AbAppletic你對我的例子有什麼看法,對你有用嗎?如果是這樣,請記住將它備份以供將來參考:)乾杯! – FabioR