2013-04-23 10 views
15

mam RelativeLayout tak:Android RelativeLayout Selector state_pressed nie działa

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
android:id="@+id/contacts" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_weight="0.2" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 

<ImageView 
    android:id="@+id/image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:contentDescription="@string/content_description_contacts" 
    android:scaleType="fitXY" 
    android:src="@drawable/contacts" /> 

<TextView 
    android:id="@+id/text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_alignBottom="@id/image" 
    android:paddingBottom="10dp" 
    android:textColor="@drawable/text_color" 
    android:text="@string/button_contacts" 
    android:textSize="12sp" />  
</RelativeLayout> 

enter image description here

i wydaje się:

enter image description here

My Selector contacts wydaje:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_pressed="true" 
    android:drawable="@drawable/contacts_over" /> 
<item android:state_selected="true" 
    android:drawable="@drawable/contacts_selected" /> 
<item 
    android:drawable="@drawable/contacts_default" /> 
</selector> 

Jak widać Mam 3 obrazy: domyślnie wybrane i naciśnięte.

Ale mam problem: tylko domyślne i state_selected obrazy działają zgodnie z oczekiwaniami, ale state_pressed nie wydają się działać.

Mam kilka wyżej wymienionych RelativeLayouts i nikt nie pracuje z state_pressed.

Czy ktoś wie, gdzie jest mój problem?

Dzięki!

Odpowiedz

35

upewnić się RelativeLayout jest klikalny

+0

+1 i V dla szybkiej odpowiedzi –

+0

Dodałem ** android: clickable = "true" ** do RelativeLayout, a kliknięcie wszędzie na RelativeLayout spowodowało stateListener wewnętrznego zobacz, aby działać! – TacB0sS

+0

Działa z 'Relativelayout' zawierającym' TextView' i 'ImageView', ponieważ muszę zastosować selektor do Rl Bg – Herry

5

Spróbuj dodać do ImageView android: klikalne = „true”

2

Moim zdaniem należy użyć Button i stworzyć selektor dla niego zamiast dokonywania przycisk niestandardowy tworząc RelativeLayout i umieszczenie tam ImageView i TextView. Następnie można użyć android:drawableTop="@drawable/your_contact_icon". Następnie możesz sprawdzić, czy twój selektor działa dobrze.

+0

dobrze, z RelativeLayout mogę zmienić tekst i nie umieścić go w obrazie. –

+0

@MaximShoustin Ok, bardzo;) – mmBs

4

Można również ustawić android:addStatesFromChildren="true" w RelativeLayout zamiast android:clickeable="true". Jeśli Twoje dzieci są już dostępne do kliknięcia, można je ustawiać itp. Nie powinieneś klikać ani ustawiać ostrości za pomocą swojego telefonu RelativeLayout.

+0

Masz rację, jeśli masz widoki podrzędne, które już zostały zarejestrowane Click Listeners to musisz dodać addStatesFromChildren = "true" wraz z clickable = "true", aby uzyskać selektor działający na Układ macierzysty. – iAviatorJose

+0

dzięki. mi to pasuje, –

0

mam nadzieję, że ci pomogli;

  1. upewnij się, że widok jest klikalny. potomkowie mogą blokować zdarzenie kliknięcia. więcej informacji przeszukaj poniższe atrybuty.

android: klikalny, android: descendantFocusability, android: aktywowana, android: focusableInTouchMode

  1. w stylu xml należy zdefiniować atrybuty stanu elementu element lub upewnij się, że przedmiot bez atrybutu musi być na końcu.

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true"> 
        <shape> 
         <solid android:color="@color/lightGold"/> 
         <stroke android:width="1dp" android:color="@color/lightGrey"/> 
         <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
        </shape> 
    </item> 
    <item> 
        <shape> 
         <solid android:color="@color/white_two"/> 
         <stroke android:width="1dp" android:color="@color/lightGrey"/> 
         <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
        </shape> 
    </item> 
    

Ale ta próba nie będzie działać;

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item> 
    <shape> 
     <solid android:color="@color/white_two"/> 
     <stroke android:width="1dp" android:color="@color/lightGrey"/> 
     <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
    </shape> 
</item> 
<item android:state_pressed="true"> 
    <shape> 
     <solid android:color="@color/lightGold"/> 
     <stroke android:width="1dp" android:color="@color/lightGrey"/> 
     <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
    </shape> 
</item> 

lub można zdefiniować atrybut państwa dla obu pozycji. Tak więc kolejność nie będzie ważna.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="false"> 
     <shape> 
      <solid android:color="@color/white_two"/> 
      <stroke android:width="1dp" android:color="@color/lightGrey"/> 
      <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
     </shape> 
    </item> 
    <item android:state_pressed="true"> 
     <shape> 
      <solid android:color="@color/lightGold"/> 
      <stroke android:width="1dp" android:color="@color/lightGrey"/> 
      <padding android:bottom="@dimen/padding1" android:left="@dimen/padding1" android:right="@dimen/padding1" android:top="@dimen/padding1"/> 
     </shape> 
    </item> 
</selector> 

Ref;

Podczas każdej zmiany stanu, lista stan ciągnie się od góry do dołu i pierwszego elementu, który odpowiada obecny stan jest używany-wybór nie opiera się na „najlepszego dopasowania”, ale po prostu pierwsza pozycja że spełnia minimalne kryteria stanu

Lista State https://developer.android.com/guide/topics/resources/drawable-resource.html

Powiązane problemy