2012-12-31 148 views
5

我有一個按鈕,其中包含一個可繪製和文本。我希望按鈕的背景不同於普通的背景(最好是純色)。這工作正常,我只需使用XML文件中的android:background屬性並相應地分配顏色。但是,我希望背景在選定或聚焦時更改爲不同的顏色(狀態選擇器)。如何設置自定義按鈕狀態背景顏色?

我試圖創建與定義的顏色繪製文件夾選擇器(帶按鈕的文本時效果很好),像這樣:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:state_focused="true" android:state_pressed="false" android:color="@color/green" /> 
     <item android:state_focused="true" android:state_pressed="true" android:color="@color/green" /> 
     <item android:state_focused="false" android:state_pressed="true" android:color="@color/green" /> 
     <item android:color="@color/white" /> 
    </selector> 

並將此XML作爲android:background屬性,像這樣:

android:background="@drawable/button_state" 

,但是這會導致強制關閉聲明:

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/button_state.xml from drawable resource ID #0x7f020070 

但資源在那裏。你不能自定義背景狀態嗎?如果可以,如何?或者我做錯了什麼?謝謝您的幫助!

+1

你絕對可以使用選擇器作爲背景繪製。你究竟把「button_state.xml」放在哪裏? –

+0

我像往常一樣將它放在可繪製文件夾中。在啓動時,應用程序強制關閉,因此它不能確認我的xml文件 – chRyNaN

+0

或者它確實可以識別xml文件,因爲如果我使用textColor屬性,它可以正常工作。只有當我使用它的背景屬性強制關閉 – chRyNaN

回答

10

您發佈的xml適用於color state list,不是可繪製的狀態列表。試試這個:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:state_pressed="false" > 
     <shape><solid android:color="@color/green"/></shape> 
    </item> 
    . . . 
</selector> 

或者,把你現有的文件到res/color並使用它,就像任何其他的色彩。但是,我不記得是否可以直接使用顏色狀態列表作爲視圖的背景。

+0

好吧,我明白這是如何工作的:當使用狀態選擇器作爲'button'的背景時,選擇器xml中定義的背景資源應該是' drawable'? – chRyNaN

+2

@AndroidStudent - 確實如此。在一個可繪製的狀態列表和一個顏色狀態列表之間有一個很大的區別(在Android的內部)。一個可繪製狀態列表只需要引用其他可繪製對象。這有點令人困惑,因爲API似乎允許在需要繪製引用的地方使用顏色引用,但這是一種無處不在的方便。 –

+0

啊我知道了,非常感謝我非常感謝! – chRyNaN

2

實施例:

XML file saved at res/color/button_text.xml: 

    <?xml version="1.0" encoding="utf-8"?> 
    <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:state_pressed="true" 
       android:color="#ffff0000"/> <!-- pressed --> 
     <item android:state_focused="true" 
       android:color="#ff0000ff"/> <!-- focused --> 
     <item android:color="#ff000000"/> <!-- default --> 
    </selector> 
    This layout XML will apply the color list to a View: 

    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/button_text" 
     android:textColor="@color/button_text" /> 

@顏色/ BUTTON_TEXT

RES /顏色/ button_text.xml

這是谷歌在ColorStateList資源提供的示例: https://developer.android.com/guide/topics/resources/color-list-resource.html

我認爲colorStateList必須用來改變widget的textView的顏色。

相關問題