2012-12-31 17 views
5

Mam przycisk, który zawiera rysowanie i tekst. Chcę, aby tło przycisku różniło się od normalnego (najlepiej zwykłego koloru). Działa to dobrze, po prostu używam atrybutu android:background w pliku XML i odpowiednio przypisuję kolor. Jednak chcę, aby tło zmieniło się na inny kolor po wybraniu lub skupieniu (selektor stanu).Jak ustawić niestandardowy kolor tła przycisku?

próbowałem stworzyć selektor w rozciągliwej folderu ze zdefiniowanymi kolorami (który działa dobrze podczas pracy z tekstem przycisku), tak jak poniżej:

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

i ustawić ten XML jako atrybutu android:background , tak jak poniżej:

android:background="@drawable/button_state" 

ale to powoduje, że siła blisko stwierdzając:

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

, ale zasób tam jest. Nie możesz dostosować stanu tła? Jeśli możesz, jak? albo co robię źle? Dzięki za pomoc!

+1

Możesz zdecydowanie użyć selektora jako tła do rysowania. Gdzie dokładnie umieściłeś 'button_state.xml'? –

+0

Umieściłem go w folderze do rysowania, jak to często robię. A po uruchomieniu aplikacja się zamyka, więc nie może potwierdzić mojego pliku xml – chRyNaN

+0

lub może rozpoznaje plik xml, bo jeśli użyję go z atrybutem textColor, to działa dobrze. Tylko wtedy, gdy używam go z atrybutem tła, wymusza on zamknięcie – chRyNaN

Odpowiedz

10

Umieszczony przez ciebie xml nadaje się do color state list, a nie do listy stanów do pobrania. Spróbuj to zamiast:

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

Ewentualnie umieścić swój istniejący plik do res/color i używać go jak każdy inny kolor. Jednak nie pamiętam, czy można użyć listy stanów kolorów bezpośrednio jako tła dla widoku.

+0

OK, tak, że rozumiem, jak to działa poprawnie: podczas używania selektora stanu dla tła 'przycisku', zasoby tła zdefiniowane w selektorze xml powinny być' drawable'? – chRyNaN

+2

@AndroidStudent - Dokładnie. Występuje duża różnica (w wewnętrznych elementach systemu Android) między listą stanów do pobrania i listą kolorów. Lista stanów do rysowania musi odwoływać się tylko do innych. To trochę zagmatwane, ponieważ wydaje się, że interfejs API pozwala używać odniesień kolorów, gdy potrzebne są odwołania do rysowania, ale to wygoda, która nie działa wszędzie. –

+0

Ah Mam to wiedzieć, wielkie dzięki, naprawdę to doceniam! – chRyNaN

2

PRZYKŁAD:

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

@ kolor/BUTTON_TEXT

Res/kolor/button_text.xml

Jest to przykład od Google w ColorStateList Resource: https://developer.android.com/guide/topics/resources/color-list-resource.html

Myślę, że colorStateList musi być użyty do zmiany koloru textView widżetu.

Powiązane problemy